在测试中出现RSpec路由错误,但在应用中没有



我在一个应用程序中有一个路由,它看起来是这样的…

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

在浏览器中我可以导航到这个URL

mylocalmachine/gb/一些公司

在服务器日志中一切正常

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"}

注意:我已经试过把这条路线放在路线的顶部。Rb文件,看看如果测试工作,但没有运气。其他规格也都通过了。任何我可能出错的想法,我将不胜感激。

更新:这是测试看起来像…

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

这是因为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中会是什么样子,因为我似乎找不到他们的文档。

最新更新