我在为以下场景编写集成(无存根)测试时遇到困难:在循环中运行的进程(rake任务),发出一些值。以下是用例的近似值。
如果我控制它,测试将会成功,但是我希望它能够抓住成功条件并停止。
任何人都有一些好的建议吗? (存根/嘲笑不是好建议)。我想可能有一种方法可以指示RSpec在匹配器返回成功后停止进程吗?
describe 'rake reactor' do
it 'eventually returns 0.3' do
expect { Rake::Task['reactor'].execute }.to output(/^0\.3.*/).to_stdout
end
end
class Reactor
def initialize
@stop = false
end
def call
loop do
break if stop?
sleep random_interval
yield random_interval
end
end
def stop
@stop = true
end
def stop?
@stop == true
end
def random_interval
rand(0.1..0.4)
end
end
desc 'Start reactor'
task reactor: :environment do
reactor = Reactor.new
trap(:INT) do
reactor.stop
end
reactor.call { |m| p m }
end
答案 0 :(得分:0)
处理它的一种天真的方法是在一些预定义的超时后启动一个新线程并从那里发送INT:
before do
Thread.new do
sleep 0.5
Process.kill('INT', Process.pid)
end
end