Ruby on rails 在RSpec中模拟超时?
我正在为Rails应用程序的一部分编写回归测试,如下所示:Ruby on rails 在RSpec中模拟超时?,ruby-on-rails,ruby,unit-testing,rspec,timeout,Ruby On Rails,Ruby,Unit Testing,Rspec,Timeout,我正在为Rails应用程序的一部分编写回归测试,如下所示: Timeout.timeout(mode == :index ? 6 : 45) do imap = Net::IMAP.new(...) end 我想验证在每种情况下(即,模式==:index和模式!=:index),是否设置了正确的超时长度 我尝试使用: 但它不会触发超时。如果我使用sleep,那么它确实有效,但显然,我并没有将sleep 45放在单元测试中 如何模拟时间的流逝来触发测试中的超时?那么expect(Timeou
Timeout.timeout(mode == :index ? 6 : 45) do
imap = Net::IMAP.new(...)
end
我想验证在每种情况下(即,模式==:index
和模式!=:index
),是否设置了正确的超时长度
我尝试使用:
但它不会触发超时。如果我使用sleep
,那么它确实有效,但显然,我并没有将sleep 45
放在单元测试中
如何模拟时间的流逝来触发测试中的超时?那么expect(Timeout)。接收(:Timeout)。使用(6)
?我觉得这种方法太间接了;i、 例如,它不会测试给定超时内发生的事情。如果您在同一方法中有多个超时,那么您可能会得到一个假阴性(如果其他超时中的一个也有6秒长)。假阴性不太可能。如果调用了两次Timeout.Timeout
,或者调用了另一个参数,则预期将失败。
allow(Net::IMAP).to receive(:new).and_wrap_original do |m, *args|
travel 6
m.call(*args)
end
expect { method }.to raise_error(Timeout::Error)