2013-04-23 1 views
0

Пожалуйста, простите Rails, вопрос о RSpec newbie здесь.Rails RSpec Sucker Punch

Я пытаюсь использовать RSpec для тестирования методов внутри класса, который я создал в файле app/workers/myworker.rb. Что-то вроде этого:

class MyWorker 
    include SuckerPunch::Worker 

    def perform(user_id) 
    do_stuff(user_id) 
    #etc 
    end 

    def do_stuff(user_id) 
    # do stuff 
    end 
end 

У меня есть спецификации файла spec/workers/myworker_spec.rb, что-то вроде этого:

require 'spec_helper' 

describe MyWorker do 
    describe "do_stuff method" do 
    test = do_stuff(3) 
    end 
end 

Я получаю undefined method 'do_stuff' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x007fef211b7840>

Любые советы о том, как включить этот MyWorker класс и его методы так что я могу проверить их с RSpec?

Спасибо.

ответ

2

Из кода вы дали, нет require или require_relative из app/workers/myworker.rb, и «тест» не в example group.

До тех пор, пока у вас не возникнут какие-либо проблемы, вы можете столкнуться с проблемами.


С стилем вы использовали выше, вы получите неявного тему:

describe MyWorker do 
    # subject { MyWorker.new } # this is not needed, and is kept in `subject` 
    describe "do_stuff method" do 
    it { should do_stuff(3) } # but `subject` doesn't need to be used when it's implicit. 
    end 
end 

Однако, это еще не выглядит как настоящий спец, он должен, вероятно, будет больше похож это:

describe MyWorker do 
    let(:worker){ MyWorker.new } 
    describe "do_stuff method" do 
    subject { worker.do_stuff(3)} 
    it { should_not be_nil } 
    its(:total) { should == 12 } 
    end 
end 

Что-то в этом роде. См. this in the docs и this blog post. Вам все равно нужно поставить тест в примерную группу. Когда вы это сделаете, вы получите бесплатно subject (т. Е. worker).

+0

получается, что это не проблема. я думаю, что 'описать MyWorker do' делает класс' MyWorker' доступным? в любом случае проблема заключалась в том, что я не создавал экземпляр класса, например, «worker = MyWorker.new», а затем «worker.do_stuff (3)». – seanomlor

+0

@seanomlor Это делает его доступным, если он уже определен, для чего нужен 'require'. Вполне возможно, что rails-rspec уже загрузил его для вас. Рад, что вы его исправили, хотя я обновил ответ с некоторыми полезными мыслями. – iain

+0

спасибо. Я думаю, что ваше обновление делает это достойным быть принятым ответом. :) – seanomlor

0

Вы неправильно do, на describe MyWorker строки:

require 'spec_helper' 

describe MyWorker do 
    describe "do_stuff method" do 
    test = do_stuff(3) 
    end 
end 
+0

спасибо. Я отредактировал мой вопрос. – seanomlor

1

Wow. Ответ был глупым.

Я предполагал, что нужно как-то потребовать app/workers/myworker.rb, но реальной проблемой было просто то, что я не создавал экземпляр класса.

describe MyWorker do 
    describe "do_stuff method" do 
    worker = MyWorker.new 
    test = worker.do_stuff(3) 
    end 
end 

Это работает.

+0

Отлично, что вы решили! Принять ответ и снять этот пост :) – Evolve