出于某种原因,我无法使用设计辅助方法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
感谢任何帮助。谢谢!
答案 0 :(得分:11)
看起来你解决了这个问题,根据你的代码来判断。我之前已经发生过这种情况,并且出于某种原因它每次都会让我感受到。
控制器规范的rspec / rails脚手架不适用于开箱即用的Devise :: TestHelpers。
get :index, {}, valid_session
valid_session调用会覆盖Devise设置的会话内容。删除它:
get :index, {}
这应该有效!
答案 1 :(得分:10)
如果您在Confirmable
模型(或其他设计可验证的模型)中包含User
模块,则必须为@user
确认您创建的测试sign_in
生效:
before :each do
@user = FactoryGirl.create :user
@user.confirm!
sign_in @user
end
(我知道这不是你的问题,但也许另一位读者可以从中受益。)
答案 2 :(得分:5)
对于规范,请务必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]
添加到之前(:每个)。 (注意,如果您不想为每个控制器执行此操作,则可以在配置中执行此操作。)
对于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
。
答案 3 :(得分:0)
我在尝试测试我正在编写的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