【问题标题】:How to test write to file with rspec?如何使用 rspec 测试写入文件?
【发布时间】: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 是对的。我们不应该测试已经测试过的函数,而是应该关注行为。

标签: ruby rspec mocking stub


【解决方案1】:

我认为测试标准库方法不是一个好主意。用

盖住它
allow(File).to receive(:open).with('config/brakeman.yml', 'wb') do |file|
  expect(file).to receive(:write).with(response.body)
end

我觉得应该够了

不要测试已经测试过的代码:)

【讨论】:

  • 我用 and_yield 代替。但是对,不要测试已经测试过的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2012-05-18
  • 2017-12-09
  • 2011-11-07
相关资源
最近更新 更多