RSpec:使用线程进行测试

时间:2013-01-30 01:59:52

标签: ruby multithreading unit-testing rspec

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

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

这有点像黑客攻击,但这里有一个before块,你可以使用yield来阻止线程转到join,但最后可以调用before do allow(Thread).to receive(:new).and_yield.and_return(Class.new { def join; end }.new) end 的线程。

<?php
$wifi2g=file_get_contents("wifi2g.txt");
?>

<link rel="stylesheet" type="text/css" href="style.css">
<div class="onoffswitch">
    <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch" <?php if ($wifi2g = 'true') {echo "unchecked"; } else  { echo "checked";}  ?> >
    <label class="onoffswitch-label" for="myonoffswitch">
        <span class="onoffswitch-inner"></span>
        <span class="onoffswitch-switch"></span>
    </label>
</div>