我在一个应用程序中有一个路由,它看起来是这样的…
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中会是什么样子,因为我似乎找不到他们的文档。