testes roscado código no rubi
-
05-07-2019 - |
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
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...