3

我正在使用的应用程序中有一条路线,它看起来像这样......

  match ":place_id/:id", :controller => "companies", :action => "show", :place_id => /\S{2}/

所以在我的浏览器中,我可以导航到这个 URL。

mylocalmachine/gb/some-company

在服务器日志中一切都很好。

Started GET "/gb/some-company" for 127.0.0.1 at 2013-04-30 17:44:52 +0100
Processing by CompaniesController#show as HTML
  Parameters: {"place_id"=>"gb", "id"=>"some-company"}

但在控制器规范中,我试图测试这条路线及其行为。

get "/gb/some-company"

但我得到这个错误

ActionController::RoutingError: No route matches {:controller=>"companies", :action=>"gb/some-comapny"}

注意:我尝试将此路由放在 routes.rb 文件的顶部,以查看测试是否有效但没有运气。所有其他规格也都通过了。我可能会出错的任何想法将不胜感激。

更新:这就是测试的样子......

params_from(:get, "/gb/some-company").should == {:controller => "companies", :action => "show", :country_id => "gb", :id => "some-company"}
4

1 回答 1

3

这是因为 RSpec 控制器测试直接将您的请求与所描述控制器的操作名称相匹配。

您的测试可能看起来像这样

describe CompaniesController do
  it "does something" do
    get "/gb/some-company"
  end
end

如果你get "/gb/some-company"

get :show, {place_id: 'gb', id: 'some-company'}

我相信它会按照你想要的方式工作。

如果您想通过 RSpec 实际将请求设为“/gb/some-company”,您可能需要查看请求规范。

他们会允许你做这样的事情

describe "Company stuff" do
  it "is awesome"
    get "/gb/some-company"
  end
end

更新

我现在假设,根据您更新的问题,您使用的是旧版本的 RSpec。RSpec 2 目前没有params_from方法

无论如何,根据你想要的,你想使用routing specs

你想要的规范在 RSpec 2 中看起来像这样

describe "Company matching" do
  it "matches the routes" do
    expect(:get => '/gb/some-company').to route_to(:controller => "companies", :action => "show", :country_id => "gb", :id => "some-company")
  end
end

我不能 100% 确定它在旧版本的 RSpec 中的外观,因为我似乎找不到他们的文档。

于 2013-04-30T17:27:02.960 回答