正在调整嵌套路由的rspec路由测试



在构建我的应用程序时,我生成了支架,它创建了标准的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生成固定装置(不确定这是否相关)

谢谢你的帮助!

首先,运行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")

最新更新