如何在Spork中运行时在Application Helper Rspec中包含路由?

时间:2013-04-16 14:08:41

标签: rspec helper rails-routing spork

我有一个rspec规范:

require "spec_helper"

describe ApplicationHelper do
  describe "#link_to_cart" do
    it 'should be a link to the cart' do
      helper.link_to_cart.should match /.*href="\/cart".*/
    end
  end
end

和ApplicationHelper:

module ApplicationHelper
  def link_to_cart
    link_to "Cart", cart_path
  end
end

这在访问网站时有效,但规格因路由不可用的RuntimeError而失败:

RuntimeError:
   In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers

所以,我在我的规范中包含Rails.application.routes.urlspec_helper - 文件甚至是ApplicationHelper本身,都无济于事。

编辑:我正在通过spork运行测试,可能与它有关并导致问题。

在使用Spork运行时,如何包含这些路线助手?

3 个答案:

答案 0 :(得分:7)

您需要在include的模块级别添加ApplicationHelper,因为默认情况下ApplicationHelper不包含url帮助程序。像这样的代码

module AppplicationHelper
  include Rails.application.routes.url_helpers

  # ...
  def link_to_cart
    link_to "Cart", cart_path
  end

 end

然后代码将起作用,您的测试将通过。

答案 1 :(得分:4)

如果您将sporkrspec一起使用,则应将url_helper方法添加到rspec配置中 -

在'/ spec / spec_helper'文件中:

RSpec.configure do |config|
.
. =begin
. bunch of stuff here, you can put the code 
. pretty much anywhere inside the do..end block
. =end
config.include Rails.application.routes.url_helpers
.
. #more stuff
end

这会加载一个名为“Routes”的内置ApplicationHelper,并将'#url_helpers'方法调用到RSpec中。无需将其添加到'/app/helpers/application_helper.rb'中的ApplicationHelper,原因有两个:

1)你只是将'routes'功能复制到一个不需要它的地方,本质上是控制器,它已经从ActionController :: Base继承了它(我想。也许:: Metal。现在不重要)。所以你不要干 - 不要重复自己

2)此错误特定于RSpec配置,将其修复到损坏的位置(我自己的小格言)

接下来,我建议稍微修改一下你的测试。试试这个:

require "spec_helper"

describe ApplicationHelper do
  describe "#link_to_cart" do
    it 'should be a link to the cart' do
     visit cart_path 
     expect(page).to match(/.*href="\/cart".*/)
    end
  end
end

我希望这对某人有帮助!

答案 2 :(得分:0)

我在guard使用spring,我发现在我的情况下,问题是由春天造成的。运行spring stop后,它已修复。但是当我改变ApplicationController中的某些内容时,它会不断回归。