RSpec Application Helper测试:未定义的局部变量或方法`helper`

时间:2014-04-30 07:38:47

标签: ruby-on-rails ruby rspec

这暂时似乎是一个闪烁的错误,但现在它一直出现:当我在一个相当简单的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 repos中没有看到任何建议helper已被弃用 - 并且运行rails g helper foo仍会生成foo_helper_spec.rb包含指示helper包含帮助程序本身的指令的文件。如果有人有任何想法,我会感激他们!

4 个答案:

答案 0 :(得分:9)

我使用全新的RSpec安装创建了一个新的Rails项目,这让我遇到了问题。显然,最近的一个测试版引入了一个名为config.infer_spec_type_from_file_location!的配置指令,该指令在我稍微较旧的spec_helper文件中丢失了;没有它,RSpec没有猜测规范类型并在相关方法中混合。小心改变!

答案 1 :(得分:6)

添加:type => :helper 所以你的代码看起来像

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

答案 2 :(得分:2)

这是一个奇怪的错误!!您确定在规范中需要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

答案 3 :(得分:0)

从回溯中看,您似乎没有使用rspec-rails宝石 - 仅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]