设计测试助手 – 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