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

2 番目のスレッドの実行によってシステム状態が変更されたことをアサートすることが目標の場合は、メイン テスト スレッドの 2 番目のスレッドに参加する必要があります。

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 に答える