Pergunta

Eu estou escrevendo um clone delayed_job para DataMapper. Eu tenho o que eu acho que está funcionando e testado código, exceto para o segmento no processo de trabalho. Olhei para delayed_job para saber como testar isso, mas agora existem testes para essa parte do código. Abaixo está o código que eu preciso de teste. Ideias? (Estou usando rspec BTW)

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

esta discussão

Foi útil?

Solução

Você poderia começar o trabalhador como um subprocesso ao testar, esperando por ele para começar totalmente, e depois verificar os sinais de saída / Enviar para ele.

Eu suspeito que você pode pegar algumas idéias de teste de concreto nesta área do href="http://unicorn.bogomips.org/" rel="nofollow noreferrer"> Unicorn projeto .

Outras dicas

A melhor abordagem, creio eu, é para stub do método Thread.new, e certifique-se de que qualquer "complicado" material está em seu próprio método que pode ser testado individualmente. Assim, você teria algo parecido com isto:

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

Então você teria que testar assim:

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

Desta forma, você não tem que Hax em torno muito para obter o resultado desejado.

É impossível tópicos de teste completamente. Melhor que você pode fazer é simulações de uso.

(algo como) object.should_recieve (: armadilha). .com ( 'TERMO') e rendimento object.start

Como cerca de apenas ter o direito de rendimento segmento em seu teste.

Thread.stub(:new).and_yield
start
# assertions...
scroll top