带有多个参数的rspec redirect_to

时间:2013-08-16 17:39:02

标签: ruby-on-rails rspec cucumber

我写了一个小测试来检查重定向和URL参数。奇怪的是,测试失败,即使错误消息似乎表明结果实际上是正确的:

Failure/Error: response.should redirect_to(movies_path(:sort => 'title'))

Expected response to be a redirect to 
<http://test.host/movies?sort=title> 
but was a redirect to 
<http://test.host/movies?ratings%5BG%5D=G&ratings%5BNC-17%5D=NC-17&ratings%5BPG%5D=PG&ratings%5BPG-13%5D=PG-13&ratings%5BR%5D=R&sort=title>

URL是相同的(因为它们应该是)和预期的参数 'sort = title'包含在实际结果的参数中。我相信这是一个有效的情况......

根据http://api.rubyonrails.org/classes/ActionDispatch/Assertions/ResponseAssertions.html#method-i-assert_redirected_to:“这个匹配可以是部分的,这样assert_redirected_to(控制器:”weblog“)也将匹配redirect_to的重定向(控制器:”weblog“,action:”show“)等等上“。

解: 我无法得到所选答案的提案,但回复有助于解释上述链接中的“部分”匹配有些误导,并且代码没有按预期工作。所以,我创建了一个包含所有参数的Hash,并将它们添加到'should redirect_to'测试中:

response.should redirect_to(movies_path(:sort => 'title', :ratings => rest))

其中'rest'就是哈希。

2 个答案:

答案 0 :(得分:2)

文档具有误导性。在内部,assert_redirected_to调用normalize_argument_to_redirection,其中(当给出散列作为参数时)在执行比较之前调用url_for。基本上,只有当路由具有默认模式:controller/:action/:id时,部分匹配才会起作用,并且断言路径是控制器或控制器以及操作作为键的散列。

答案 1 :(得分:1)

您应该输入类似的内容:

response.should redirect_to(movies_path(:sort => 'title', :ratings => "Ratings"))

它应该是重定向的完整路径。