3

我写了一个小测试来检查重定向和 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(controller: "weblog") 也将匹配重定向重定向到(控制器:“weblog”,操作:“show”)等等。”

解决方案:我无法让所选答案的提案生效,但回复有助于解释上述链接中的“部分”匹配有些误导,并且代码没有按预期工作。所以,我用收到的所有参数创建了一个Hash,并将它们添加到“应该重定向_to”测试中:

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

其中'rest'是那个哈希。

4

2 回答 2

3

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

于 2013-08-16T18:09:09.080 回答
2

你应该把这样的东西:

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

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

于 2013-08-16T18:05:45.787 回答