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