【发布时间】:2020-09-19 10:47:24
【问题描述】:
我的功能代码是这样的:
Dir.mkdir('config') unless File.exist?('config')
File.open('config/brakeman.yml', 'wb') do |file|
file.write(response.body)
如何测试 file.write(response.body) 行? 我试图像这样模拟和存根:
allow(response).to receive(:body).and_return(body)
allow(File).to receive(:open).with('config/brakeman.yml', 'wb') do |file|
file.write(response.body)
end
expect(File).to receive(:open).with('config/brakeman.yml', 'wb')
subject.create_config(response)
expect(file).to receive(:write).with(body)
expect(File.open('config/brakeman.yml')).to eq(body)
【问题讨论】:
-
运行测试时会得到什么?
-
测试那条线的目的是什么?
IO#write是在标准库中实现的,所以我觉得没有特别需要测试它。仅仅是为了增加测试覆盖率吗? -
如果这是一项关键测试,您可能希望使用fakefs gem 来存根文件系统。写入实际文件系统可能会导致测试幂等性的各种问题,并且像这样广泛模拟会导致测试在重构代码时中断。您应该测试代码的作用——而不是它的工作方式。
-
是的,我希望这一行主要用于测试覆盖,但 Amir 是对的。我们不应该测试已经测试过的函数,而是应该关注行为。