温馨提示:本文翻译自stackoverflow.com,查看原文请点击:ruby on rails - rspec sign_in works in requests but not in controller
ruby-on-rails rspec

ruby on rails - rspec sign_in适用于请求,但不适用于控制器

发布于 2020-04-04 00:00:39

我有这个spec \ requests \ sessions_spec.rb

require 'rails_helper'

RSpec.describe "Sessions" do
 it "signs user in and out" do
    u = sign_in mockuser
    p u.inspect 
 end

end

上面的代码效果很好,

但是,当我从控制器调用相同的sign_in时,我现在为此奋斗了10个小时。

spec \ controllers \ properties_controller_spec.rb

require 'rails_helper'

describe PropertiesController do

    context 'when searching after  login' do 
        it 'should success and render to index page' do
           u = sign_in mockuser
           p u.inspect // returns nil
        end
    end
end

我的规格\ support \ devise_request_spec_helper.rb

module DeviseRequestSpecHelpers

   include Warden::Test::Helpers

   def sign_in(resource_or_scope, resource = nil)
     resource ||= resource_or_scope
     scope = Devise::Mapping.find_scope!(resource_or_scope)
     login_as(resource, scope: scope)
   end
end

查看更多

提问者
Code Tree
被浏览
121
max 2020-01-31 20:30

Warden测试助手无法使用控制器规范,因为控制器规范会伪造整个请求阶段,从而绕过中间件。

要么使用Devise::Test::ControllerHelpers存根守望者,要么使用程序和沟渠控制器规范,而只编写请求规范

请求规范提供了控制器规范的高级替代方案。实际上,从RSpec 3.5开始,Rails和RSpec团队都不鼓励直接测试控制器,而转而使用诸如请求规范之类的功能测试。
- RSpec的护栏自述