我们如何使用 RSpec 测试 ruby 的 Timeout.timeout?



示例代码段:

require "tty-prompt"
require "timeout"
def prompt_with_timeout
prompt = TTY::Prompt.new
timeout_duration = 60
response = ""
Timeout.timeout(timeout_duration, Timeout::Error) do
response = prompt.yes?("Do you agree?")
rescue Timeout::Error => e
puts "Prompt timed out!"
exit 1
end
if response == "yes" || response == "y"
# do something
else
# do something else
end
end

我们将如何使用RSpec测试上述功能?

我正在尝试使用RSpec测试上述超时功能。我想写一个RSpec测试来捕获来自救援块的消息。

使用测试替身。RSpec还提供了matcher,用于以声明方式测试stdout的输出,因此是smth。希望以下内容就足够了:

let(:prompt) { instance_double("TTY::Prompt") }
before do
allow(TTY::Prompt).to receive(:new).and_return(prompt)
allow(prompt).to receive(:yes?).and_raise(Timeout::Error)
end
specify do
expect { prompt_with_timeout }.to output("Prompt timed out!").to_stdout
end

首先,我真的不知道你想做什么,也不知道你为什么要测试它。但我已经试着为你的例子想出了一个解决方案。

我会把持续时间放在一个常数中,并用rspec将其截断,这样你就不必等待60秒来运行一个简单的测试。

它看起来像这样:

require "tty-prompt"
require "timeout"
require 'rspec'
TIMEOUT_DURATION = 60
def prompt_with_timeout
prompt = TTY::Prompt.new
response = ""
Timeout.timeout(TIMEOUT_DURATION, Timeout::Error) do
response = prompt.yes?("Do you agree?")
rescue Timeout::Error => e
puts "Prompt timed out!"
exit 1
end
if response == "yes" || response == "y"
# do something
else
# do something else
end
end
describe "Prompt with timeout" do
it "returns the correct message on timeout" do
stub_const("TIMEOUT_DURATION", 0.1)
expect(prompt_with_timeout).to eq("Prompt timed out!")
end
end
RSpec::Core::Runner.run([$__FILE__])

最新更新