Devise и Rspec - undefined метод `authenticate! ' для nil: NilClass

Я пытаюсь проверить свой контроллер для доступа от незарегистрированных пользователей. Im с использованием devise (3.3.0) и rspec (3.0.0).

spec/controllers/dares_controller_spec.rb
require 'rails_helper'
describe DaresController do
 let(:challenger) { create(:user) }
 let(:acceptor) { create(:user) }
 let(:challenge) { create(:challenge) }
 let(:dare) { create(:dare) }
 let(:user) { create(:user) }
 describe 'Guest access to dares' do
 describe 'GET #show' do
 it "redirects to root" do
 get :show, id: dare.id, challenge_id: challenge.id
 expect(response).to require_login
 end
 end
 end
end

В контроллере:

dares_controller.rb
before_action :authenticate_user!
 def show
 end

Я получаю следующую ошибку:

Failures:
 1) DaresController Guest access to dares GET #show redirects to root
 Failure/Error: get :show, id: dare.id, challenge_id: challenge.id
 NoMethodError:
 undefined method `authenticate!' for nil:NilClass
 # ./spec/controllers/dares_controller_spec.rb:16:in `block (4 levels) in <top (required)="">'
</top>

Я попробовал добавить

RSpec.configure do |config|
 config.include Devise::TestHelpers, :type => :controller
end

для моего spec_helper/rails_helper, но это не исправить проблему. Я искал решения для нескольких часов, кажется, помогает.

Матчи - require_login

RSpec::Matchers.define :require_login do |expected|
 match do |actual|
 expect(actual).to redirect_to Rails.application.routes.url_helpers.new_user_session_path
 end
 failure_message do |actual|
 "expected to require login to access the method"
 end
 failure_message_when_negated do |actual|
 "expected not to require login to access the method"
 end
 description do
 "redirect to the login form"
 end
end
1 ответ

измените эту строку:

описать DaresController do

к этому:

RSpec.describe DaresController, введите:: controller do

Поскольку вы настраиваете spec_helper или rails_helper с помощью:

config.include Devise::TestHelpers, type: :controller

Вы должны правильно настроить spec type. Это поведение rspec в rspec ~ 3

licensed under cc by-sa 3.0 with attribution.