测试不通过:未定义的方法`authenticate!’ 为零:NilClass?

我有以下失败:

Failures: 1) RelationshipsController creating a relationship with Ajax should increment the Relationship count Failure/Error: xhr :post, :create, relationship: { followed_id: other_user.id } NoMethodError: undefined method `authenticate!' for nil:NilClass # ./spec/controllers/relationships_controller_spec.rb:14:in `block (4 levels) in ' # ./spec/controllers/relationships_controller_spec.rb:13:in `block (3 levels) in ' 

但是很奇怪,如果我访问该网站,事情就会起作用(如果我点击“ 关注”按钮, 关注 followers计数器会增加:

在此处输入图像描述

而最奇怪的是,没有任何认证! relations_controller_spec.rb中的方法:

 require 'spec_helper' describe RelationshipsController do let(:user) { FactoryGirl.create(:user) } let(:other_user) { FactoryGirl.create(:user) } before { sign_in user } describe "creating a relationship with Ajax" do it "should increment the Relationship count" do expect do xhr :post, :create, relationship: { followed_id: other_user.id } end.to change(Relationship, :count).by(1) end it "should respond with success" do xhr :post, :create, relationship: { followed_id: other_user.id } response.should be_success end end describe "destroying a relationship with Ajax" do before { user.follow!(other_user) } let(:relationship) { user.relationships.find_by_followed_id(other_user) } it "should decrement the Relationship count" do expect do xhr :delete, :destroy, id: relationship.id end.to change(Relationship, :count).by(-1) end it "should respond with success" do xhr :delete, :destroy, id: relationship.id response.should be_success end end end 

在控制器中都没有:

 class RelationshipsController < ApplicationController before_filter :authenticate_user! def create @user = User.find(params[:relationship][:followed_id]) current_user.follow!(@user) respond_to do |format| format.html { redirect_to @user } format.js end end def destroy @user = Relationship.find(params[:id]).followed current_user.unfollow!(@user) respond_to do |format| format.html { redirect_to @user } format.js end end end 

可能是什么问题呢?

(顺便说一句,这些测试是在Ruby on Rails Tutorial之后进行的。之后,我删除了所有的身份validation系统,因为我想使用Devise 。)

设置config.include Devise::TestHelpers, :type => :controller不再适用于更高版本的Devise。 您需要做的是注销匿名用户以设置适当的变量:

 before :each do sign_out :user end 

我不得不补充一点:

spec_helpers.rb:

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