在 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