我写了一个小测试来检查重定向和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'就是哈希。
答案 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"))
它应该是重定向的完整路径。