2013-04-30 73 views
3

我有一个应用程序,我工作的一个途径,它看起来像这样...RSpec的路由错误的测试,但不是在应用

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

所以在我的浏览器,我可以导航到该网址。

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

注:我试图把这个路线在routes.rb中文件的顶部,看看测试工作,但没有运气。其他所有规格也都通过了。任何想法,我可能会出错,将不胜感激。

UPDATE:这是测试的样子......

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

回答

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 

UPDATE

现在我假设的基础上,更新后的问题,您使用的是旧版本的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中看起来如何,因为我似乎无法找到他们的文档。

+0

是的,这工作表示感谢,测试实际上是确保params正确地从URL中提取。我已经更新了问题以显示实际测试,有没有更好的方法可以为此编写测试? – cih 2013-04-30 17:34:27

+0

看看我的更新回答 – 2013-04-30 17:51:43

+0

这正是我所追求的,我正在从Rails 2-3和RSpec升级到版本2的过程中。感谢您的帮助! – cih 2013-04-30 18:05:36