7

我有一个 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.url在我的规范中包含了spec_helper-file 甚至它ApplicationHelper本身,但无济于事。

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

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

4

3 回答 3

9

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

module AppplicationHelper
  include Rails.application.routes.url_helpers

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

 end

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

于 2013-04-17T07:50:46.357 回答
5

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

'/spec/spec_helper' 文件中的任何位置:

# spec/spec_helper.rb

RSpec.configure do |config|
  ...
  config.include Rails.application.routes.url_helpers
  ...
end

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

  1. 您只是将“路由”功能复制到不需要它的地方,本质上是控制器,它已经从 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

我希望这对某人有帮助!

于 2013-07-06T22:16:10.683 回答
0

我在使用guardwith 时spring发现,就我而言,问题是由 spring 引起的。运行spring stop后就解决了。但有时当我更改ApplicationController.

于 2015-03-13T19:19:00.563 回答