在构建我的应用程序时,我生成了脚手架,它创建了标准的Rspec测试。我想将这些测试用于覆盖,但由于嵌套路由,它们似乎失败了:
当我运行测试时,这是它的反馈:
Failures:
1) ListItemsController routing routes to #index
Failure/Error: get("/list_items").should route_to("list_items#index")
No route matches "/list_items"
# ./spec/routing/list_items_routing_spec.rb:7:in `block (3 levels) in <top (required)>'
Finished in 0.25616 seconds
1 example, 1 failure
如何告诉Rspec有嵌套路由?
以下是删节文件:
list_items_routing_spec.rb:
require "spec_helper"
describe ListItemsController do
describe "routing" do
it "routes to #index" do
get("/list_items").should route_to("list_items#index")
end
end
list_items_controller_spec.rb:
describe ListItemsController do
# This should return the minimal set of attributes required to create a valid
# ListItem. As you add validations to ListItem, be sure to
# adjust the attributes here as well.
let(:valid_attributes) { { "list_id" => "1", "project_id" => "1" } }
# This should return the minimal set of values that should be in the session
# in order to pass any filters (e.g. authentication) defined in
# ListItemsController. Be sure to keep this updated too.
let(:valid_session) { {} }
describe "GET index" do
it "assigns all list_items as @list_items" do
list_item = ListItem.create! valid_attributes
get :index, project_id: 2, {}, valid_session
assigns(:list_items).should eq([list_item])
end
end
routes.rb中:
resources :projects do
member do
match "list_items"
end
end
注意: - 我已经尝试过更改rpec测试本身以包含project_id,但这没有帮助。 - 我正在使用Factory Girl进行夹具生成(不确定这是否相关)
感谢您的帮助!
答案 0 :(得分:3)
首先,运行rake routes
以查看存在的路由。
根据您在路线中的内容,我希望您的ProjectsController
有一个动作list_items
。此操作可在/projects/:id/list_items
下找到。
现在我只能理解你真正想要的东西,但我会猜测。
如果您希望/projects/:project_id/list_items
路由到list_items#index
,则必须将路由更改为:
resources :projects do
resources :list_items
end
您可以通过运行rake routes
来确认。
然后在路由规范中修复断言:
get("/projects/23/list_items").should route_to("list_items#index", :project_id => "23")
更新RSpec v2.14 +预期
expect(:get => "/projects/23/list_items").to route_to("list_items#index", :project_id => "23")