2009-10-22 3 views
4

Я пишу delayed_job клон для DataMapper. У меня есть то, что, как я думаю, работает и проверено кодом, за исключением потока в рабочем процессе. Я посмотрел на delayed_job, как проверить это, но теперь есть тесты для этой части кода. Ниже приведен код, который мне нужно проверить. идеи? (Я использую RSpec BTW)проверка резьбового кода в ruby ​​

def start 
    say "*** Starting job worker #{@name}" 
    t = Thread.new do 
    loop do 
     delay = Update.work_off(self) #this method well tested 
     break if $exit 
     sleep delay 
     break if $exit 
    end 
    clear_locks 
    end 

    trap('TERM') { terminate_with t } 
    trap('INT') { terminate_with t } 

    trap('USR1') do 
    say "Wakeup Signal Caught" 
    t.run 
    end 

смотри также this thread

+0

«см. Также эту тему» ​​- был ли это умышленный каламбур? –

+0

Только если вы хотели, чтобы это было –

ответ

3

Вы могли бы начать работника как подпроцесс при тестировании, ждет его полностью start, а затем проверить сигналы выхода/отправки на него.

Я подозреваю, что вы можете получить немало конкретных идей по тестированию в этой области от проекта Unicorn.

0

его невозможное, чтобы проверить темы полностью. Лучше всего вы можете использовать mocks.

(что-то подобное) object.should_recieve (: ловушка). .с ('TERM') и выход object.start

0

Как насчет того, чтобы иметь прямолинейный результат в вашем тесте.

Thread.stub(:new).and_yield 
start 
# assertions... 
8

Лучший подход, я считаю, это незавершенный метод Thread.new, и убедитесь, что любой «сложный» материал в своем собственном методе, который может быть проверен индивидуально. Таким образом, вы бы что-то вроде этого:

class Foo 
    def start 
     Thread.new do 
      do_something 
     end 
    end 
    def do_something 
     loop do 
      foo.bar(bar.foo) 
     end 
    end 
end 

Тогда вы бы проверить, как это:

describe Foo 
    it "starts thread running do_something" do 
     f = Foo.new 
     expect(Thread).to receive(:new).and_yield 
     expect(f).to receive(:do_something) 
     f.start 
    end 
    it "do_something loops with and calls foo.bar with bar.foo" do 
     f = Foo.new 
     expect(f).to receive(:loop).and_yield #for multiple yields: receive(:loop).and_yield.and_yield.and_yield... 
     expect(foo).to receive(:bar).with(bar.foo) 
     f.do_something 
    end 
end 

Таким образом, вы не должны Hax вокруг так много, чтобы получить желаемый результат.

+1

Так я решил решить эту проблему. Благодаря! – Arnlen

+0

@Arnlen Glad Я мог бы помочь :) – Automatico

Смежные вопросы