rspec 期待空路由
rspec expecting empty routing
我正在我的应用程序上实施 API,并使用 Rspec 对其进行测试。
我的物品控制器没有 new
或 edit
操作,并且 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') }
我正在我的应用程序上实施 API,并使用 Rspec 对其进行测试。
我的物品控制器没有 new
或 edit
操作,并且 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') }