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