如何为循环编写集成测试?

时间:2017-05-12 22:58:23

标签: ruby rspec rspec3

我在为以下场景编写集成(无存根)测试时遇到困难:在循环中运行的进程(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

1 个答案:

答案 0 :(得分:0)

处理它的一种天真的方法是在一些预定义的超时后启动一个新线程并从那里发送INT:

  before do
    Thread.new do
      sleep 0.5
      Process.kill('INT', Process.pid)
    end
  end