Devise将#authenticated
和#unauthenticated
约束添加到路由dsl,但它们依赖于request.env['warden']
响应#authenticate?
。据我了解,该请求在路由规范中不存在,因此失败的原因为:
# NoMethodError:
# undefined method `authenticate?' for nil:NilClass
设计问题#1670,#1779表明这是一个限制,但不建议如何克服它。
我决定试图剔除authenticate?
,但之前从未做过茬,所以这种做法大部分时间都是命中注定。
我的第一次尝试看起来像这样:
require 'spec_helper'
describe 'routes for Tenant' do
it 'routes /organization to TenantsController#show' do
allow_message_expectations_on_nil
allow_any_instance_of(Object).to receive(:authenticate?).and_return(true)
expect(get: '/organization').to route_to(
controller: 'tenants',
action: 'show'
)
end
end
问题:我不习惯在全球范围内authenticate?
或NilClass
。我怎么能把这个...更常见...这样我就不会陷入特定的实现?
我想以某种方式隐藏#authenticated
和#unauthenticated
以简单地忽略它们的实现和yield
但是尝试这样做仍会导致原始的NoMethodError
,就好像我的假实施不存在:
expect_any_instance_of(ActionDispatch::Routing::Mapper).to receive(:authenticated) { yield }
expect_any_instance_of(ActionDispatch::Routing::Mapper).to receive(:unauthenticated) { false }
为什么它第一种方式起作用而不是第二种方式?