在路由规范中删除设计#authenticated和#unauthenticated

时间:2014-02-02 20:32:08

标签: ruby-on-rails ruby rspec devise stubbing

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 }

为什么它第一种方式起作用而不是第二种方式?

0 个答案:

没有答案