我有这个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
Warden测试助手无法使用控制器规范,因为控制器规范会伪造整个请求阶段,从而绕过中间件。
要么使用Devise::Test::ControllerHelpers
存根守望者,要么使用程序和沟渠控制器规范,而只编写请求规范。
请求规范提供了控制器规范的高级替代方案。实际上,从RSpec 3.5开始,Rails和RSpec团队都不鼓励直接测试控制器,而转而使用诸如请求规范之类的功能测试。
- RSpec的护栏自述
我从来没有想到在控制器上使用请求规范的想法。非常感谢男人!
它是一个相对较新的开发/转变,大约在2015年左右出现。控制器规范存在许多已知问题,因为它们遗漏了框架的大部分内容,但我们仍使用它们,因为它们比集成测试快。尽管Rails团队确实投入了大量工作,
ActionDispatch::IntegrationTest
但使速度更快,而事实并非如此。RSpec文档还没有赶上。控制器规格文档上应该有个大警告。