使用 Minitest 测试文件写入
Using Minitest to Test File Write
有没有办法使用 minitest mock/stub 文件读取和写入(文本文件)而不实际存在它们?
实际代码类似于
def write_to_file(filename)
f = File.open(filename,"w")
f.puts "hello world"
f.close
end
我真的不知道如何尝试,因为我找不到任何模拟文件 IO 的示例,只能比较变量
如果我要按照你的建议去做,我会把 File.open
存根到 return 一个像这样的模拟:
def test_something_that_reads_a_file
file_mock = Minitest::Mock.new
file_mock.expect(:readline, "It was the best of times...")
File.stub(:open, file_mock) do
# your test logic here
end
file_mock.verify
end
您在某些时候仍然遇到 returning EOF
的问题,但这对您来说是否是个问题取决于上下文,我没有给出您所写的内容。
但是有几个原因导致我可能永远不会这样处理这个问题。
- 不要嘲笑你不拥有的东西。是的,
File#readline
的语义明天可能不会改变,但是对您无法控制的接口做出假设是一种不好的做法。
- 对我来说,这看起来像是一种非 public 方法。如果我是对的,那么我根本不会测试它。私有方法是不需要自己测试的实现细节。如果您坚决不在这里做任何 I/O,我宁愿存根该方法的结果,而不是我上面所做的。
我将采用的方法是包含一个小的测试文件并实际从中读取。因此,您的测试将更容易理解。
有没有办法使用 minitest mock/stub 文件读取和写入(文本文件)而不实际存在它们?
实际代码类似于
def write_to_file(filename)
f = File.open(filename,"w")
f.puts "hello world"
f.close
end
我真的不知道如何尝试,因为我找不到任何模拟文件 IO 的示例,只能比较变量
如果我要按照你的建议去做,我会把 File.open
存根到 return 一个像这样的模拟:
def test_something_that_reads_a_file
file_mock = Minitest::Mock.new
file_mock.expect(:readline, "It was the best of times...")
File.stub(:open, file_mock) do
# your test logic here
end
file_mock.verify
end
您在某些时候仍然遇到 returning EOF
的问题,但这对您来说是否是个问题取决于上下文,我没有给出您所写的内容。
但是有几个原因导致我可能永远不会这样处理这个问题。
- 不要嘲笑你不拥有的东西。是的,
File#readline
的语义明天可能不会改变,但是对您无法控制的接口做出假设是一种不好的做法。 - 对我来说,这看起来像是一种非 public 方法。如果我是对的,那么我根本不会测试它。私有方法是不需要自己测试的实现细节。如果您坚决不在这里做任何 I/O,我宁愿存根该方法的结果,而不是我上面所做的。
我将采用的方法是包含一个小的测试文件并实际从中读取。因此,您的测试将更容易理解。