我正在尝试测试命名空间Rails控制器操作的路由,并且没有正确设置。
我已经看过以下问题,他们似乎都没有回答过手边的问题,更不用说回答我的问题了:
并不是说我将不正确的参数传递给动作,而是在此测试的上下文中,路径根本不匹配。我在这里缺少什么?
config / routes.rb(使用版本主义宝石):
...
api_version(module: 'api/v1', path: {value: 'v1'}) do
namespace :nphase do
resource :device_service, controller: 'device_service', only: :none, format: :json do
collection do
post :get_device_information
end
end
end
end
...
应用程序/控制器/ API / V1 / device_service_controller.rb:
module Api
module V1
class DeviceServiceController < ApplicationController
respond_to :json
def get_device_information
respond_with json: {"success" => true}
end
end
end
end
rake routes |grep nphase
的输出:
get_device_information_v1_nphase_device_service POST /v1/nphase/device_service/get_device_information(.:format) api/v1/nphase/device_service#get_device_information {:format=>:json}
规格/路由/ API / V1 / device_service_routing_spec.rb:
require 'spec_helper'
describe 'routes for DeviceService' do
it 'routes correctly' do
expect(post('/v1/nphase/device_service/get_device_information')).to route_to(
controller: 'api/v1/device_service',
action: 'get_device_information'
)
end
end
测试失败:
Failure/Error: expect(post('/v1/nphase/device_service/get_device_information')).to route_to(
No route matches "/v1/nphase/device_service/get_device_information"
答案 0 :(得分:2)
通过运行您的规范(虽然在Rails 4中),我收到了这个错误:
Failure/Error: expect(post: '/v1/nphase/device_service/get_device_information').to route_to(
A route matches "/v1/nphase/device_service/get_device_information", but references missing controller: Api::V1::Nphase::DeviceServiceController
# ./spec/controller_spec.rb:5:in `block (2 levels) in <top (required)>'
这告诉我们您的控制器不在Nphase
模块中。
通过使用namespace
,您告诉Rails在特定模块中搜索控制器。
所以要么将控制器放在正确的模块中(并相应地更改目录结构),要么告诉rails在正确的位置寻找控制器(来自the Rails guides):
如果你想路由/ admin / articles到ArticlesController(没有Admin :: module前缀),你可以使用:
scope '/admin' do resources :articles, :comments end