Ruby 如何使用rspec测试文件写入?

Ruby 如何使用rspec测试文件写入?,ruby,rspec,mocking,stub,Ruby,Rspec,Mocking,Stub,我的功能代码如下: 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

我的功能代码如下:

      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)

我认为测试标准库方法不是一个好主意。只需要盖上

allow(File).to接收(:open).with('config/brakeman.yml','wb')do|文件|
预期(file).to接收(:write).with(response.body)
结束
我想这就足够了


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

运行测试时会得到什么?测试该行的目的是什么
IO#write
是在标准库中实现的,所以我觉得没有必要对其进行测试。这仅仅是为了增加测试覆盖率吗?如果这是一个关键测试,您可能希望使用gem来清除文件系统。写入实际的文件系统可能会导致各种各样的测试幂等性问题,而像这样的大量模拟将导致测试中断,如果代码被重构。你应该测试代码的功能,而不是它是如何工作的。是的,我希望这一行主要是为了测试覆盖率,但阿米尔是对的。我们不应该测试已经测试过的func,而是应该关注其行为。我使用了and_yield。但对,不要测试已经测试过的代码。