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

Dan*_*iel 6 ruby rspec ruby-on-rails

这似乎是一段闪烁的错误,但现在它一直出现:当我在一个相当简单的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>'
Run Code Online (Sandbox Code Playgroud)

这是完整的spec文件(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
Run Code Online (Sandbox Code Playgroud)

直到最近,这一直在进行,但我不确定我能做些什么来打破这样一个基本功能.我正在使用Rails和RSpec的边缘版本,但是在他们的git repos中没有看到任何建议helper已被弃用的东西---并且运行rails g helper foo仍然会生成一个foo_helper_spec.rb文件,其中helper包含指示包含帮助程序本身的指令.如果有人有任何想法,我会感激他们!

Dan*_*iel 9

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


小智 6

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

describe ApplicationHelper, type: :helper do
 ...
end
Run Code Online (Sandbox Code Playgroud)