gpt4 book ai didi

ruby - 使用 RSpec 通过获取测试用户输入

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:40 25 4
gpt4 key购买 nike

我是使用 RSpec 和 Ruby 进行单元测试的新手,我对如何测试我的代码是否使用 gets 方法有疑问,但没有提示用户输入。

这是我要测试的代码。这里没什么特别的,只是一个简单的衬垫。

我的文件.rb

My_name = gets

这是我的规范。

require 'stringio'

def capture_name
$stdin.gets.chomp
end

describe 'capture_name' do
before do
$stdin = StringIO.new("John Doe\n")
end

after do
$stdin = STDIN
end

it "should be 'John Doe'" do
expect(capture_name).to be == 'John Doe'
require_relative 'my_file.rb'
end
end

现在这个规范有效,但是当我运行代码时它会提示用户输入。我不希望它那样做。我想简单地测试是否正在调用 gets 方法并可能模拟用户输入。不确定如何在 RSpec 中实现这一点。在 Python 中我会使用 unittest.mock RSpec中有类似的方法吗?

提前致谢!

最佳答案

下面是如何使用返回值对 gets 进行 stub 。

require 'rspec'

RSpec.describe do
describe 'capture_name' do
it 'returns foo as input' do
allow($stdin).to receive(:gets).and_return('foo')
name = $stdin.gets

expect(name).to eq('food')
end
end
end

Failures:

1) should eq "food"
Failure/Error: expect(name).to eq('food')

expected: "food"
got: "foo"

(compared using ==)

要测试是否正在调用某些东西(例如函数),您可以使用 expect($stdin).to receive(:gets).with('foo') 来确保它正在被调用用正确的参数调用(一次)。此场景中的期望线必须位于 name = $stdin.gets 之前。

关于ruby - 使用 RSpec 通过获取测试用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com