出于某种原因,我不能得到的色器件的辅助方法sign_in工作。 CURRENT_USER被继续空。 任何想法的问题可能是什么?
测试:
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的/导轨支架材料控制器的规格不会制定:: TestHelpers工作开箱。
get :index, {}, valid_session
该valid_session通话将覆盖设计建立会话的东西。 去掉它:
get :index, {}
这应该工作!
如果包括Confirmable
在你的模块User
模型(或其它色器件,可认证的型号),然后测试@user
创建必须确认为sign_in
生效:
before :each do
@user = FactoryGirl.create :user
@user.confirm!
sign_in @user
end
(我看,这是不是你的问题,但也许另一位读者应该从中受益。)
对于规范,确保include Devise::TestHelpers
。 为了方便,在我的规格/ 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
设计使用中的呼叫用户模型中定义user_signed_in?
和current_user
在控制器中。 原因是,如果您有:
class Admin < ActiveRecord::Base
devise
end
然后设计将有方法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