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

时间:2014-01-09 16:23:03

标签: ruby-on-rails-4 rspec-rails

我正在用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')

的调用进行存根来修复它

2 个答案:

答案 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"