【问题标题】:RSpec: Testing with ThreadsRSpec:使用线程进行测试
【发布时间】:2013-01-30 01:59:52
【问题描述】:

在 RSpec 中,我有创建一个新线程的函数,并在该线程内执行一些操作——在我的例子中,调用 TCPSocket#readline。这是现在的功能:

def read
  Thread.new do
    while line = @socket.readline
      #TODO: stuff
    end
  end
end

由于线程调度,如果这样写,我的测试将失败:

it "reads from socket" do
  subject.socket.should_receive(:readline)
  subject.read
end

目前我知道解决这个问题的唯一方法是使用sleep 0.1。有没有办法适当地延迟测试直到该线程运行?

【问题讨论】:

    标签: ruby multithreading unit-testing rspec


    【解决方案1】:

    如果您的目标是断言系统状态会因执行第二个线程而改变,您应该加入主测试线程中的第二个线程:

    it "reads from socket" do
      subject.socket.should_receive(:readline)
      socket_thread = subject.read
      socket_thread.join
    end
    

    【讨论】:

    【解决方案2】:

    这有点小技巧,但这里有一个 before 块,您可以使用该块,以防您希望线程到 yield,但能够在线程结束时调用 join。

    before do
      allow(Thread).to receive(:new).and_yield.and_return(Class.new { def join; end }.new)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2017-07-22
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多