Rspec无法识别Rails的content_tag

时间:2015-01-28 22:39:49

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

我有一个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)

2 个答案:

答案 0 :(得分:1)

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

module NavHelper
  include ActionView::Helpers::TagHelper

  # ...
end

最好只包含你需要帮助的东西,因为它可以清楚地告诉你在帮助器中使用的Rails / ActionView的哪些部分。

编辑:为什么这有必要?

当您测试帮助程序时,您将与其他Rails隔离进行测试。这就是为什么RSpec抱怨这种方法不可用 - 它确实不存在!

答案 1 :(得分:0)

问题是我的规范的主线。我将require 'spec_helper'更改为require 'rails_helper',一切正常。

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