Rails 4 - nil的未定义方法'authenticate':NilClass

时间:2016-07-05 21:42:59

标签: ruby-on-rails ruby devise shoulda

我正在开发一个使用Rails 4& S构建社交网络的课程。设计。

我一直试图让课程通过,这是我得到的错误:

1) Error:
UserFriendshipsControllerTest#test_: #new when not logged in should get redirected to the login page. :
NoMethodError: undefined method `authenticate!' for nil:NilClass
    test/controllers/user_friendships_controller_test.rb:8:in `block (3 levels) in <class:UserFriendshipsControllerTest>'

这是我的users_friendships_controller_test.rb:

require 'test_helper'

class UserFriendshipsControllerTest < ActionController::TestCase

context "#new" do
    context "when not logged in" do
        should "get redirected to the login page" do
            get :new
            assert_response :redirect
      end
    end
  end
end

我的user_friendship.rb:

class UserFriendship < ActiveRecord::Base
    belongs_to :user
    belongs_to :friend, class_name: "User", foreign_key: "friend_id"

    private

        def friendship_params
            params.require(:user).permit(:user_id, :friend_id, :friend)
        end
end

我在user_friendships_controller.rb中添加的唯一内容是一个空白的新方法,并且:

before_filter :authenticate_user!, only: [:new]

如果我要发布更多代码,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:4)

我在documentation找到了答案:

  

如果您选择在routes.rb中进行身份验证,则您将无法进行身份验证   通过assert_routing测试你的路线(它结合了assert_recognizes   和assert_generates,所以你也失去了它们。这是一个限制   Rails:Rack首先运行并检查您的路由信息​​,但从那以后   功能/控制器测试在控制器级别运行,你不能   向Rack提供认证信息   request.env [&#39; warden&#39;]为零,Devise生成以下内容之一   错误:

NoMethodError: undefined method 'authenticate!' for nil:NilClass
NoMethodError: undefined method 'authenticate?' for nil:NilClass
  

解决方案是在控制器测试中测试经过身份验证的路由。至   执行此操作,将控制器测试的身份验证方法存根。

How to stub authentication.