Devise 和 Rspec - 无法识别的方法 `authenticate!' for nil:NilClass

11

我正在尝试测试我的控制器是否可以被未注册用户访问。我使用的是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)>'
我尝试添加。
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

我尝试使用我的spec_helper/rails_helper文件,但没有解决问题。我在Google上搜索了几个小时的解决方案,似乎没有什么帮助。

匹配器 - 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

4
请查看此链接:如何在控制器测试中设置身份验证桩,该链接详细介绍了如何在控制器测试中设置身份验证桩。 - gotva
嗯,我遇到了完全相同的错误,只是当我尝试模拟request.env['warden']时,它也返回nil,所以我最终在nil上模拟一个方法,导致测试失败。 - Hakanai
1个回答

3

更改这一行:

描述DaresController do

为这一行:

RSpec.describe DaresController, type: :controller do

由于您使用以下配置spec_helper或rails_helper:

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

您应该正确设置spec type 以使其正常工作。这是rspec~3中的一个rspec行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接