Почему мой RSpec не загружает Devise::Test::ControllerHelpers?

Я использую Rails 5 и Devise 3.5.1.

Просматривая хорошую (старую) книгу о создании/тестировании API, в котором используется аутентификация Devise. Он был написан до Rails 5, поэтому я решил не использовать новую версию только для API.

Вот мой тест...

#/spec/controllers/api/v1/users_controller_spec.rb    

require 'rails_helper'

describe Api::V1::UsersController, :type => :controller do
    before(:each) { request.headers['Accept'] = "application/vnd.marketplace.v1" }
    describe "GET #show" do
        before(:each) do
            @user = FactoryGirl.create :user
            get :show, params: {id: @user.id}, format: :json
        end
        it "returns the information about a reporter on a hash" do
            user_response = JSON.parse(response.body, symbolize_names: true)
            expect(user_response[:email]).to eql @user.email
        end
        it { should respond_with 200 }
    end
end

А вот и совершенно неожиданная ошибка RSpec

Devise::MissingWarden:
       Devise could not find the `Warden::Proxy` instance on your request environment.
       Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack.
       If you are seeing this on one of your tests, ensure that your tests are either executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` module to inject the `request.env['warden']` object for you.

Итак, я иду сюда - http://www.rubydoc.info/gems/devise/Devise/Test/ControllerHelpers

и попробовал это -> include Devise::Test::ControllerHelpers

что не помогло, потому что файла controller_helpers.rb нигде нет в моем проекте

Что я здесь пропустил?

Спасибо


person dwilbank    schedule 17.07.2016    source источник
comment
Согласно этому ответу, вы не можете использовать Warden/Devise в тесте контроллера (ActionController::TestCase), потому что это промежуточное ПО Rack, а промежуточное ПО Rack не загружено для тестов контроллера. stackoverflow.com/questions/13420923/   -  person Chloe    schedule 20.09.2018


Ответы (3)


Вы можете добавить следующее к вашему rails_helper:

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :controller
end

Это будет включать модуль Devise::Test::ControllerHelpers во всех спецификациях :controller.

person lest    schedule 17.07.2016
comment
Хорошо, это имеет смысл. Спасибо, сэр. Тип: :controller предназначен только для экономии памяти, когда RSpec запускает другие типы тестов? - person dwilbank; 17.07.2016
comment
Devise::Test::ControllerHelpers предназначен для использования только в тестах контроллера, поэтому я думаю, что некоторые другие спецификации могут быть нарушены, если он будет включен во все из них. Вот почему нам нужно указать type: :controller. - person lest; 17.07.2016

В spec_helper.rb добавить:

config.include Devise::Test::ControllerHelpers, :type => :controller
person Angel Huezo    schedule 07.08.2016
comment
Это полезно даже для людей, не использующих rspec. +1 - person Darth Egregious; 25.08.2016
comment
для тех, кто будет читать в будущем — если вы используете рельсы — подумайте о том, чтобы добавить это в файл rails_helper. - person BKSpurgeon; 03.02.2018

МиниТест, Рельсы 4

Это работает для ванильного Rails 4 MiniTest

test\controllers\users_controller_test.rb
require 'test_helper'

class UsersControllerTest < ActionController::TestCase
  include Warden::Test::Helpers
  include Devise::Test::ControllerHelpers

  setup do
    # https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara
    # @user = users(:admin)
    # sign_in @user
  end

  teardown do
    Warden.test_reset!
  end

  test "login as admin" do
    @user = users :admin
    sign_in @user
    get :dashboard
    assert_redirected_to admin_dashboard_path
  end

end
person Chloe    schedule 19.09.2018