3

我正在尝试为我的一个控制器上的自定义操作编写请求规范。

我的 routes.rb 是这样的:

resources :cars do
  member do
    get :search
  end
end

我的 cars_controller.rb 是这样的:

class CarsController < ApplicationController
  def search
    # pending 
  end
end

我的 controller_cars_spec.rb 是这样的:

describe CarsController do
  describe 'Search' do
    it 'should call the model method that perform search by brand' do
      get :search
    end  
  end
end

耙子路线说:

search_car GET    /cars/:id/search(.:format) {:action=>"search", :controller=>"cars"}

和自动测试说:

Failures:
1) CarsController Search should call the model method that perform search by brand
   Failure/Error: get :search
   ActionController::RoutingError:
     No route matches {:controller=>"cars", :action=>"search"}
   # ./spec/controllers/cars_controller_spec.rb:19:in `block (3 levels) in <top (required)>'

有什么问题?我无法解决这个失败...

4

4 回答 4

1

简而言之,这应该做你想要的:

get :search, :car_id => @car.id

当您使用资源时,您需要匹配每个参数的路由,但这还不是全部。就像是:

get :search, :id => @car.id

似乎它会工作,但没有。

使用资源助手时,ID 是通过在任何子路由和资源的资源名称前加上前缀来命名的。我不完全确定为什么 rspec 错误不会抱怨缺少:car_id,也许其他人可以填补知识的缺失部分。

于 2015-04-01T15:52:48.333 回答
1

您需要将 :id 参数传递给您的规范文件中的路由,如本文所示: “没有路由匹配”错误?

get :search, :id => @car.id
于 2013-02-12T02:26:26.540 回答
0

检查是否

resources :cars

是之前

match '/cars/:id/search' => 'cars#search'
于 2013-08-22T09:28:03.807 回答
0

member是针对单个资源的,因此它需要一个:id。你要:

resources :cars do
  collection do
    get :search
  end
end
于 2012-11-02T14:49:48.987 回答