为视图规范播种路径的正确方法

pho*_*oet 3 rspec-rails ruby-on-rails-4

我正在用RSpec测试我的观点.由于一些变化,现在url_for在视图中调用了我为show动作编写的所有规范都失败了:

No route matches {:controller=>"events", :action=>"show"}
Run Code Online (Sandbox Code Playgroud)

:id部分缺失以及由于呼叫失败.

(我知道我可以将那个失败的方法调用存根)

我发现唯一的东西很旧,看起来像一个糟糕的解决方法.另外,RSpec的文件没有显示什么帮助.

有没有正确的方法告诉RSpec它应该是什么样的events/123

更多背景:

在视图中我调用了一个帮助器,如下所示:

def some_helper_method
  url_for(only_path: false)} + "something_else"
end
Run Code Online (Sandbox Code Playgroud)

对该方法的调用失败了

 Failure/Error: render
 ActionView::Template::Error:
   No route matches {:controller=>"events", :action=>"show"}
Run Code Online (Sandbox Code Playgroud)

我正在通过对该方法的调用进行存根来修复它 view.stub(some_helper_method: 'SOME_URL')

Gui*_*nco 7

好的,我想我找到了答案.我克隆了你的repo并调试了很多= P,直到我发现你需要在视图规范中推断出所需的参数,因为rspec-rails只为:controller正在渲染的视图提供参数.好吧,为了更好地理解问题是什么,我在rspec-rails文档中找到了这个解释:

查看规范推断控制器名称和从路径到视图模板的路径.例如,如果模板是"events/index.html.erb",那么:

controller.controller_path == "events" controller.request.path_parameters[:controller] == "events"

这意味着大多数情况下您不需要设置这些值.当指定包含在不同控制器中的部分时,您可能需要在渲染视图之前覆盖这些值

换句话说,您发布的上一个链接仍然有效,并且仍然是视图规范中参数"问题"的解决方案.您可以在此PullRequest线程中关注有关该主题的讨论.

因此,得出的结论是,如果你真的不想来,踩灭你打电话给url_for助手(或正在调用它的助手),您需要提供所期望的:id,因为有任何表演动作没有路由参数没有:id参数(如你指出).我们的最终结果(测试)确实是:

controller.request.path_parameters[:id] = event.id

如果这是一个解决方法?我真的不这么认为,因为rspec-rails本身在内部使用此功能来提供:controller参数.

对不起,我之前没有更多的帮助,但我认为这关闭了我们所有的主要疑虑.

我的看法 ?如果你真的不需要根据url_for行为(或任何帮助行为)做出任何断言,只需将其存根,因为预计它已经被隔离测试.否则,请使用:id参数,不要担心.这不是一种解决方法.

干杯啦!