9

在 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. 有没有办法正确延迟测试直到该线程运行?

4

2 回答 2

12

如果您的目标是通过执行第二个线程来断言系统状态发生变化,您应该加入主测试线程中的第二个线程:

it "reads from socket" do
  subject.socket.should_receive(:readline)
  socket_thread = subject.read
  socket_thread.join
end
于 2013-01-30T18:04:48.687 回答
5

这有点小技巧,但是before如果您希望线程yield能够join在线程结束时调用,您可以使用这里的块。

before do
  allow(Thread).to receive(:new).and_yield.and_return(Class.new { def join; end }.new)
end
于 2016-09-03T00:01:28.890 回答