我正在用RSpec测试我的观点。由于某些更改,现在在视图中调用了url_for
,并且我为show
操作编写的所有规范都失败了:
No route matches {:controller=>"events", :action=>"show"}
:id
部分缺失,因此调用失败。
(我知道我可以将那个失败的方法调用存根)
only thing I found已经很老了,看起来像是一个糟糕的解决方法。此外,RSpec documentation并未显示有用的内容。
是否有正确的方法告诉RSpec它应该是events/123
?
更多背景信息:
在视图中 我打电话给帮手,就像这样:
def some_helper_method
url_for(only_path: false)} + "something_else"
end
对该方法的调用失败,
Failure/Error: render
ActionView::Template::Error:
No route matches {:controller=>"events", :action=>"show"}
我正在通过对该方法view.stub(some_helper_method: 'SOME_URL')
答案 0 :(得分:7)
好的,我想我找到了答案。我克隆了你的repo并调试很多= P 直到我发现你需要在你的视图规范中推断出所需的参数,因为rspec-rails只提供{{1正在呈现的视图的参数。好吧,为了更好地理解问题是什么,我在rspec-rails文档中找到了这个解释:
查看规范推断控制器名称和路径到视图模板的路径。例如如果模板是“events / index.html.erb”,那么:
:controller
controller.controller_path == "events"
这意味着大多数情况下您不需要设置这些值。当指定包含在不同控制器中的部分时,您可能需要在渲染视图之前覆盖这些值
换句话说,您发布的上一个link仍然有效,并且仍然是视图规范中参数“问题”的解决方案。您可以在此PullRequest主题中关注有关该主题的讨论。
因此,结论是,如果您真的不想将对controller.request.path_parameters[:controller] == "events"
帮助程序(或调用它的帮助程序)的调用存根,则需要提供所需的url_for
参数因为没有:id
参数的任何展示动作都没有路由(正如你所指出的那样)。我们的最终结果(测试)确实是:
:id
如果这是一个解决方法?我真的不这么认为,因为 rspec-rails本身在内部使用此功能来提供controller.request.path_parameters[:id] = event.id
参数。
对不起我之前没有更多的帮助,但我认为这关闭了我们所有的主要疑虑。
我的意见?如果你真的不需要根据:controller
行为(或任何帮助行为)做出任何断言,只需将其存根,因为预计它已经被隔离测试。否则,请使用url_for
参数,不要担心。 不是一种解决方法。
干杯啦!
答案 1 :(得分:-2)
如果你遇到id问题,请在你的route.rb
中试试get "events/show/:id", :to=> "events#show"