以下是routes.rb
的路线:
resources :books, :except => [:new, :edit] do
post "pull" => "books#update", :data => { "pull" => true }
rake routes
按预期显示内容
pull_api_v1_book POST /api/v1/books/:id/pull(.:format)
api/v1/books#update {:format=>:json, :data=>{"pull"=>true}}
运行dev服务器,路由按预期工作:
curl -X POST http://localhost:3000/api/v1/books/3/pull?auth_token=1234567890
我在books_controller_spec.rb中的规范:
describe "pull api" do
it "should not fail" do
post :pull, params: { :id => 12 }
end
end
但是规范的输出:
Failure/Error: post :pull, params: { :id => 12 }
ActionController::UrlGenerationError:
No route matches {:action=>"pull", :controller=>"api/v1/books", :id=>12}
为什么rspec找不到路线?
答案 0 :(得分:2)
rails中的控制器测试实际上不会调用路由,它只是用于调用控制器操作的语法糖。您的规范应该致电:
post :update, params: { :id => 12 }
如果您确实想测试路线,则应使用请求规范。