Ruby on rails 在RSpec中模拟超时?

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

我正在为Rails应用程序的一部分编写回归测试,如下所示:

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)