在 rspec 中设计 "user_signed_in?" 方法
devise "user_signed_in?" method in rspec
我有一个控制器动作,它使用设计的“user_signed_in?”作为条件。操作如下所示:
def show
if user_signed_in?
#do stuff
end
end
但是当我在 RSpec 中测试这个动作时,测试失败了,因为 if 块中的代码永远不会被执行。有什么方法可以存根“user_signed_in?”方法吗?
代码未执行,因为用户可能未登录。
要在 rspec 中登录设计用户,请将其放入 spec/support/controller_macros.rb
。
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
user.confirm! #if you are using the "confirmable" module
sign_in user
end
end
end
在spec/rails_helper.rb
中有这个:
RSpec.configure do |config|
config.include Devise::Test::ControllerHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
end
然后在您的控制器规格中:
describe MyController do
login_user
....
end
您可以像这样模拟 user_signed_in?
方法:
before do
allow_any_instance_of(Devise::Controllers::Helpers).to receive(:user_signed_in?).and_return(false)
end
我有一个控制器动作,它使用设计的“user_signed_in?”作为条件。操作如下所示:
def show
if user_signed_in?
#do stuff
end
end
但是当我在 RSpec 中测试这个动作时,测试失败了,因为 if 块中的代码永远不会被执行。有什么方法可以存根“user_signed_in?”方法吗?
代码未执行,因为用户可能未登录。
要在 rspec 中登录设计用户,请将其放入 spec/support/controller_macros.rb
。
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
user.confirm! #if you are using the "confirmable" module
sign_in user
end
end
end
在spec/rails_helper.rb
中有这个:
RSpec.configure do |config|
config.include Devise::Test::ControllerHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
end
然后在您的控制器规格中:
describe MyController do
login_user
....
end
您可以像这样模拟 user_signed_in?
方法:
before do
allow_any_instance_of(Devise::Controllers::Helpers).to receive(:user_signed_in?).and_return(false)
end