【问题标题】:RSpec Application Helper Test: Undefined local variable or method `helper`RSpec Application Helper Test:未定义的局部变量或方法`helper`
【发布时间】:2014-04-30 07:38:47
【问题描述】:

这似乎是一个闪烁的错误有一段时间,但现在它一直出现:当我在一个相当简单的 ApplicationHelper 规范上运行 RSpec 时,我收到以下错误:

% rspec --backtrace
  1) ApplicationHelper renders Markdown from plain text                                                                                                                           
     Failure/Error: expect(helper.md(plaintext)).to eq("<h1 id=\"header\">Header</h1>\n")
     NameError:
       undefined local variable or method `helper' for #<RSpec::ExampleGroups::ApplicationHelper_2:0x000001248d1218>
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-expectations-0f7b78587ab4/lib/rspec/matchers.rb:903:in `method_missing'
     # ./spec/helpers/application_helper_spec.rb:4:in `block (2 levels) in <top (required)>'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:148:in `instance_exec'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:148:in `block in run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `call'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `block (2 levels) in <class:Procsy>'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-rails-480b173c9ad6/lib/rspec/rails/adapters.rb:67:in `block (2 levels) in <module:MinitestLifecycleAdapter>'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:292:in `instance_exec'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:292:in `instance_exec'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/hooks.rb:430:in `block (2 levels) in run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `call'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `block (2 levels) in <class:Procsy>'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/hooks.rb:432:in `run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/hooks.rb:485:in `run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:301:in `with_around_example_hooks'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:145:in `run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:494:in `block in run_examples'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:490:in `map'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:490:in `run_examples'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:457:in `run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:112:in `block (2 levels) in run_specs'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:112:in `map'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:112:in `block in run_specs'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/reporter.rb:49:in `report'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:108:in `run_specs'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:86:in `run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:70:in `run'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:38:in `invoke'
     # /Users/danielsh/.rvm/gems/ruby-2.1.1@project-staging-ng/bundler/gems/rspec-core-4219c4786f6f/exe/rspec:4:in `<top (required)>'
     # /Users/danielsh/Dropbox/Project/Websites/Angular/bin/rspec:20:in `load'
     # /Users/danielsh/Dropbox/Project/Websites/Angular/bin/rspec:20:in `<main>'

这是完整的规范文件(spec_helper 包含在我的 .rspec 文件中):

describe ApplicationHelper do
  it 'renders Markdown from plain text' do
    plaintext = '# Header'
    expect(helper.md(plaintext)).to eq("<h1 id=\"header\">Header</h1>\n")
  end
end

直到最近才出现这种情况,但我不确定我可以做些什么来破坏这样一个基本功能。我正在使用 Rails 和 RSpec 的边缘版本,但在他们的 git 存储库中没有看到任何表明 helper 已被弃用的内容——并且运行 rails g helper foo 仍然会生成一个 foo_helper_spec.rb 文件,其中包含指示 @ 987654330@ 包含助手本身。如果有人有任何想法,我将不胜感激!

【问题讨论】:

标签: ruby-on-rails ruby rspec


【解决方案1】:

我使用全新的 RSpec 安装创建了一个新的 Rails 项目,这导致我遇到了问题。显然,最近的一个测试版引入了一个名为 config.infer_spec_type_from_file_location! 的配置指令,我稍早的 spec_helper 文件中缺少该指令;没有它,RSpec 不会猜测规范类型并混合相关方法。谨防重大更改!

【讨论】:

  • @codenoob 你必须在你的spec_helper.rb 文件中添加config.infer_spec_type_from_file_location!。谢谢! @丹尼尔!这对我有帮助
【解决方案2】:

添加:type =&gt; :helper 所以你的代码应该是这样的

describe ApplicationHelper, type: :helper do
 ...
end

【讨论】:

    【解决方案3】:

    这是一个奇怪的错误!你确定你的规范中需要spec_helper 吗?

    无论如何你可以尝试不使用helper 方法:

    首先您应该首先将以下内容添加到/spec/spec_helper.rb

    RSpec.configure do |config|
      ...
      config.include ApplicationHelper
    end
    

    然后在没有 helper 的情况下进行测试,所以它将是:

    describe ApplicationHelper do
      it 'renders Markdown from plain text' do
        plaintext = '# Header'
        expect(md(plaintext)).to eq("<h1 id=\"header\">Header</h1>\n")
      end
    end
    

    【讨论】:

    • 您好!包括ApplicationHelper 和没有helper 的测试再次将套件变为绿色,但我不确定这意味着什么。我将spec_helper 包含在.rspec 中,但将其添加到规范本身并不会改变任何事情。
    【解决方案4】:

    从回溯来看,您似乎没有使用 rspec-rails gem - 只是 rspec-corerspec-expectations

    rspec-rails 为您的辅助规范提供了helper 方法。从我的代码库中的规范内部:

    (rdb:1) self.method(:helper).source_location
    ["/home/becky/.gem/ruby/2.0.0/gems/rspec-rails-2.14.1/lib/rspec/rails/example/helper_example_group.rb", 19]
    

    【讨论】:

    • 我遇到了类似的问题,当我在调试测试时运行该命令时,我得到:["/home/vagrant/.rvm/rubies/ruby-2.1.2/lib/ruby/ gems/2.1.0/gems/actionpack-4.1.1/lib/abstract_controller/helpers.rb", 110] 我确实包含了 rspec-rails gem
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多