На фабриках.rb:
FactoryBot.define do
factory :user do
email { Faker::Internet.email }
username { Faker::FunnyName.name.downcase.gsub(/\s/,"_") }
first_name { Faker::Name.name }
last_name { Faker::Name.name }
password "password"
password_confirmation "password"
confirmed_at Date.today
roles { [ FactoryBot.create(:role) ] }
factory :admin do
roles { [ FactoryBot.create(:admin_role) ] }
end
end
factory :role do
name { Faker::Job.field.downcase }
factory :admin_role do
name "admin"
end
end
В support/controller_macros.rb
module ControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
admin = FactoryBot.create(:admin)
sign_in :user, admin
end
end
end
В rails_helper.rb:
config.include Devise::Test::ControllerHelpers, type: :controller
config.extend ControllerMacros, type: :controller
In filters_controller_spec.rb:
require 'rails_helper'
describe GlobalFiltersController, type: :controller do
describe "GET #new" do
context "when model is an :ActiveRecord object" do
login_admin
it "should have a current_user" do
expect(subject.current_user).to_not eq(nil)
end
Тем не менее, я получаю следующие результаты в Rspec:
FiltersController GET #new when model is an :ActiveRecord object should have a current_user
Failure/Error: expect(subject.current_user).to_not eq(nil)
ArgumentError:
uncaught throw :warden
Ошибка входа. Но в моем приложении это не подводит. Я не уверен, что я делаю неправильно в этом тесте. Как я могу пройти тест, когда использую Devise?