设计测试助手 – sign_in不起作用

出于某种原因,我无法使用设计辅助方法sign_in来工作。 current_user保持为null。 知道问题可能是什么?

测试:

before :each do @user = FactoryGirl.create :user sign_in @user end describe "GET index" do it "assigns all subscribers as @subscribers" do subscriber = @user.subscribers.create! valid_attributes get :index assigns(:subscribers).should eq([subscriber]) end end 

执行:

  def index @subscribers = current_user.subscribers.all <------- ERROR respond_to do |format| format.html # index.html.erb format.json { render json: @subscribers } end end Error: NoMethodError: undefined method `subscribers' for nil:NilClass 

任何帮助表示赞赏。 谢谢!

看起来你解决了这个,从你的代码判断。 我之前已经发生过这种情况,并且出于某种原因它每次都会让我感觉到。

控制器规范的rspec / rails脚手架不适用于开箱即用的Devise :: TestHelpers。

 get :index, {}, valid_session 

valid_session调用会覆盖Devise设置的会话内容。 去掉它:

 get :index, {} 

这应该工作!

如果在User模型(或其他设计@user模型)中包含可Confirmable模块,则必须确认您创建的测试@user以使sign_in生效:

 before :each do @user = FactoryGirl.create :user @user.confirm! sign_in @user end 

(我看到这不是你的问题,但也许另一位读者可以从中受益。)

对于规范,请确保include Devise::TestHelpers 。 为了方便起见 ,在我的spec / spec_helper.rb中 ,我有:

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

它自动包含所有控制器规格。

此外,您需要这样做才能使sign_in工作:

 @request.env["devise.mapping"] = Devise.mappings[:user] get :new 

最好将@request.env["devise.mapping"] = Devise.mappings[:user]到之前的(:each)。 (注意,如果您不想为每个控制器执行此操作,则可以在配置中执行此操作)。


对于current_user部分,请确保您具有模型User ,您可以在其中调用devise

 class User < ActiveRecord::Base # call devise to define user_signed_in? and current_user devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable # though you don't have to include all these modules end 

Devise使用User模型中的调用来定义user_signed_in? 和控制器中的current_user 。 原因是如果你有:

 class Admin < ActiveRecord::Base devise end 

那么Devise会有方法admin_signed_in?current_admin定义。

我在尝试测试我正在编写的SSO端点是为用户创建会话时遇到了这个问题。 由于它只适用于一个测试,我只需要在测试之前添加以下块

  before do @request.env["devise.mapping"] = Devise.mappings[:user] user = FactoryGirl.create(:user, :email => email, :password => "password") user.confirm! end it "should create and session for the user and redirect to home page" do