2014-04-30 16 views
5

To wydawało się przez pewien czas migotliwym rodzajem błędu, ale teraz pojawia się konsekwentnie: kiedy uruchamiam RSpec na dość prostej specyfikacji ApplicationHelper, otrzymuję następujący błąd:Test pomocnika aplikacji RSpec: Niezdefiniowana zmienna lokalna lub metoda `helper`

% 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/[email protected]/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/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:148:in `instance_exec' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:148:in `block in run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `call' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `block (2 levels) in <class:Procsy>' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-rails-480b173c9ad6/lib/rspec/rails/adapters.rb:67:in `block (2 levels) in <module:MinitestLifecycleAdapter>' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:292:in `instance_exec' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:292:in `instance_exec' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/hooks.rb:430:in `block (2 levels) in run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `call' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:208:in `block (2 levels) in <class:Procsy>' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/hooks.rb:432:in `run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/hooks.rb:485:in `run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:301:in `with_around_example_hooks' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example.rb:145:in `run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:494:in `block in run_examples' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:490:in `map' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:490:in `run_examples' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/example_group.rb:457:in `run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:112:in `block (2 levels) in run_specs' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:112:in `map' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:112:in `block in run_specs' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/reporter.rb:49:in `report' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:108:in `run_specs' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:86:in `run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:70:in `run' 
    # /Users/danielsh/.rvm/gems/[email protected]/bundler/gems/rspec-core-4219c4786f6f/lib/rspec/core/runner.rb:38:in `invoke' 
    # /Users/danielsh/.rvm/gems/[email protected]/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>' 

Oto pełna plik spec (spec_helper jest włączone jako część mojego pliku .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 

ten pracował do niedawna, ale nie jestem pewien, co mogłem zrobić, aby złamać taki podstawowy wyczyn ure. Używam wersji Edge Rails i RSpec, ale nie widziałem niczego w repozytoriach git sugerujących, że helper było przestarzałe --- i działając rails g helper foo nadal generuje plik foo_helper_spec.rb z instrukcjami wskazującymi, że helper zawiera samego helpera. Jeśli ktokolwiek ma jakieś pomysły, byłbym im wdzięczny!

+0

jak ty definiującej 'ApplicationHelper'? – sevenseacat

+0

Jest to całkiem proste, przynajmniej tak daleko, jak widzę. Oto sedno, ponieważ komentarz nie pobierze próbki kodu: https://gist.github.com/anonymous/752547b5c480391893aa – Daniel

Odpowiedz

9

Stworzyłem nowy projekt Rails ze świeżą instalacją RSpec i to doprowadziło mnie do problemu. Najwyraźniej jedna z ostatnich betów wprowadziła dyrektywę konfiguracyjną o nazwie config.infer_spec_type_from_file_location!, której brakowało w moim nieco starszym pliku spec_helper; bez niego RSpec nie zgadł typ spec i mieszanie w powiązanych metod. Uważaj, łamanie zmian!

+0

Jak to naprawiłeś? – codenoob

+0

@codenoob Musisz dodać 'config.infer_spec_type_from_file_location!' W swoim pliku 'spec_helper.rb'. Dzięki! @ Daniel! To mi pomogło – cdpalmer

0

Z śladu po śladach nie wygląda na to, że używasz klejnotu rspec-rails - tylko rspec-core i rspec-expectations.

rspec-rails jest tym, co zapewnia metodę helper do specyfikacji pomocnika. Od środka specyfikacji w mojej bazie kodów:

(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] 
+0

Mam podobne problemy i kiedy uruchomię to polecenie podczas debugowania testu, otrzymam: ["/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] Mam klejnot rspec-rails w zestawie – William

1

To dziwny błąd !! czy na pewno wymagałeś spec_helper w specyfikacji?

Zresztą można spróbować bez metody helper:

Pierwszy należy najpierw dodać do /spec/spec_helper.rb następujące:

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

Następnie testu bez helper, więc będzie to:

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 
+0

Cześć! W tym 'ApplicationHelper' i testowanie bez' helper' zmieniło kolor na zielony, ale nie jestem pewien co by to wskazywało. Załączam 'spec_helper' w' .rspec', ale dodanie go do samej specyfikacji nic nie zmieni. – Daniel

4

dodaj :type => :helper więc kod powinien wyglądać

describe ApplicationHelper, type: :helper do 
... 
end 
Powiązane problemy