Kar*_*ran 9 testing ruby-on-rails devise
出于某种原因,我无法使用设计辅助方法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
Run Code Online (Sandbox Code Playgroud)
执行:
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
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.谢谢!
Jel*_*Cat 12
如果Confirmable
在User
模型中包含模块(或其他可设计版本的模型),则@user
必须确认您创建的测试sign_in
才能生效:
before :each do
@user = FactoryGirl.create :user
@user.confirm!
sign_in @user
end
Run Code Online (Sandbox Code Playgroud)
(我看到这不是你的问题,但也许另一位读者可以从中受益.)
Tyl*_*non 11
看起来你解决了这个,从你的代码判断.我之前已经发生过这种情况,并且出于某种原因它每次都会让我感觉到.
控制器规范的rspec/rails脚手架不适用于开箱即用的Devise :: TestHelpers.
get :index, {}, valid_session
Run Code Online (Sandbox Code Playgroud)
valid_session调用会覆盖Devise设置的会话内容.去掉它:
get :index, {}
Run Code Online (Sandbox Code Playgroud)
这应该工作!
对于规范,请确保include Devise::TestHelpers
.为了方便起见,在我的spec/spec_helper.rb中,我有:
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
end
Run Code Online (Sandbox Code Playgroud)
它自动包含所有控制器规格.
此外,您需要执行此操作以使sign_in工作:
@request.env["devise.mapping"] = Devise.mappings[:user]
get :new
Run Code Online (Sandbox Code Playgroud)
最好添加@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
Run Code Online (Sandbox Code Playgroud)
设计使用中的呼叫用户模型中定义user_signed_in?
并current_user
在控制器中.原因是如果你有:
class Admin < ActiveRecord::Base
devise
end
Run Code Online (Sandbox Code Playgroud)
然后Devise会有方法admin_signed_in?
和current_admin
定义.
归档时间: |
|
查看次数: |
9650 次 |
最近记录: |