rspec 期待空路由

rspec expecting empty routing

我正在我的应用程序上实施 API,并使用 Rspec 对其进行测试。

我的物品控制器没有 newedit 操作,并且 routes.rb 没有它们的路线:

namespace :api, defaults: {format: 'json'} do
  namespace :v1 do
    resources :items, except: [:new, :edit]
  end
end

我对他们的 rspec 测试看起来像:

it "raises error on #new" do      
  expect(:get => "/api/v1/items/new").to have_http_status(404)
end

但是当我对其执行测试时,我得到:

Api::V1::ItemsController routing raises error on #new
 Failure/Error: expect(:get => "/api/v1/items/new").to have_http_status(404)
   expected a response object, but an instance of Hash was received
 # ./spec/routing/items_routing_spec.rb:11:in `block (3 levels) in <top (required)>'

我不确定如何处理这个案例并让测试通过。

您正在传递期望的哈希值:

{ :get => "/api/v1/items/new" }

但是你的断言只对响应对象有效。您可能想按照

的方式做一些事情
get "/api/v1/items/new"
expect(response).to have_http_status(404)

但如果您尚未定义该路由,则此测试也可能会失败。

有关 have_http_status 匹配器的文档,请参阅 this

您可能正在寻找 be_routable 匹配器:

it { expect(get: '/api/v1/items/new').to_not be_routable }

来自文档:

The be_routable matcher is best used with should_not to specify that a given route should not be routable. It is available in routing specs (in spec/routing) and controller specs (in spec/controllers).

作为 new 被解释为 show 问题的解决方法,您可以使用名为 route_to:

的替代匹配器
it { expect(get: '/api/v1/items/new').to_not route_to('/api/v1/items#new') }

it { expect(get: '/api/v1/items/new').to_not route_to(controller: '/api/v1/items', action: 'new') }