我是RSpec和Ruby单元测试的新手,我想知道如何测试我的代码是否使用了
这是我的规格。
现在这个规范是起作用的,但当我运行代码时它会提示用户输入。我不想让它这样做。我只想测试是否调用了gets方法,并可能模拟用户输入。不太确定如何在RSpec中实现这一点。在Python中,我会利用unittest.mock,是否有类似的方法可以在RSpec中使用?
提前致谢!
gets
方法,但不需要提示用户输入。
这是我要测试的代码。没有什么特别的,只是一个简单的一行代码。
my_file.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中使用?
提前致谢!
require_relative 'my_file.rb'
这行代码放到expect
下面确实可以工作。但是,这仍然不能保证gets
方法被调用了。如果我将My_name
的值更改为除了gets
之外的任何其他值,测试仍然会通过。我需要单元测试在gets
没有被调用时失败。我更新了我的代码。 - salceexpect(My_name).to eq("John Doe\n")
。然而,由于require_relative
和标准输入之间的某些交互作用,测试将失败。总的来说,在类外执行代码并尝试通过在测试中引用它来测试它是一条错误的道路。我想建议一条好的路径,但很难为你的示例做到这一点。在所需的文件中将gets
分配给常量的目的是什么?也许更多的上下文会有所帮助。 - Dave Schweisguthgets
方法,我希望他们声明一个变量并用gets
初始化它,并通过在线编译器提交答案。我使用单元测试来检查是否正确(通过/失败)。My_name
变量之所以是常量,仅因为我需要它是全局的,以便从规范文件中访问它。我希望能够创建一个基于单元测试的测试,以检查用户是否声明了一个变量并使用gets
方法进行了初始化。 - salce