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

时间:2013-07-15 17:12:33

标签: ruby-on-rails rspec routes

在构建我的应用程序时,我生成了脚手架,它创建了标准的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进行夹具生成(不确定这是否相关)

感谢您的帮助!

1 个答案:

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