Rspec 无法识别 Rails 的 content_tag

Rspec Does Not Recognize Rails's content_tag

我有一个 Rails (4.2) 助手,我正在尝试使用 Rspec 3.

进行单元测试
# app/helpers/nav_helper.rb
module NavHelper
  def nav_link(body, url, li_class: "", html: {})
    li_class += current_page?(url) ? " active" : ""

    content_tag(:li, class: li_class) do
      link_to(body, url, html)
    end
  end
end

# spec/helpers/nav_helper_spec.rb
require 'spec_helper'
describe NavHelper do
  describe "#nav_link" do
    it "creates a correctly formatted link" do
      link = nav_link("test", "www.example.com/testing")
      ...
    end
  end
end

当我 运行 测试时,这会抛出以下错误:

 Failure/Error: link = nav_link("test", "www.example.com/testing")
 NoMethodError:
   undefined method `content_tag' for #<RSpec::ExampleGroups::NavHelper::NavLink:0x007fe44b98fee0>
 # ./app/helpers/nav_helper.rb:5:in `nav_link'

Rails 助手似乎不可用,但我不确定如何添加它们。无论如何,我如何测试使用 content_tag?

的辅助方法

更新

添加include ActionView::Helpers::TagHelper会抛出以下错误

uninitialized constant ActionView (NameError)

您需要在 NavHelper 中包含包含 content_tag 方法的帮助程序(在本例中为 TagHelper):

module NavHelper
  include ActionView::Helpers::TagHelper

  # ...
end

最好只包含使事情正常运行所需的助手,因为它可以清楚地表明您在助手中使用了 Rails/ActionView 的哪些部分。

编辑:为什么这是必要的?

当您测试助手时,您是在将它与 Rails 的其余部分隔离开来进行测试。这就是为什么 RSpec 抱怨该方法不可用 - 它实际上不存在!

这个问题是我的规范的首要问题。我将 require 'spec_helper' 更改为 require 'rails_helper' 并且一切正常。

这不是第一次咬我,但这是最难的。