当路径存在时,Rspec路由规范失败

时间:2015-02-18 15:04:07

标签: ruby-on-rails ruby rspec routing

我正在尝试测试命名空间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"

1 个答案:

答案 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