rspec sign_in 适用于请求但不适用于控制器

rspec sign_in works in requests but not in controller

我有这个 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

我的spec\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

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

要么使用 Devise::Test::ControllerHelpers 来代替 warden,要么使用程序和沟槽控制器规格,而只写 request specs

Request specs provide a high-level alternative to controller specs. In fact, as of RSpec 3.5, both the Rails and RSpec teams discourage directly testing controllers in favor of functional tests like request specs.
- rspec-rails readme