如何在rspec中测试文件是否被删除?

时间:2017-08-07 14:31:25

标签: ruby-on-rails ruby rspec

我想知道如何在rspec中测试是否删除了特定文件。这是我正在测试的代码

def check_status
  filename = File.join('test', 'status.txt')
  File.delete(filename ) if File.exist?(filename)
end

这是测试:

before do
  allow(File).to receive(:exist?).and_return(true)
  allow(File).to receive(:delete)
end

it {expect(File).to receive(:delete).with("test/status.txt") }

我收到错误

(File (class)).delete("test/status.txt")
    expected: 1 time with arguments: ("test/status.txt")
    received: 0 times

请你帮我解决这个问题。我确信我的代码会删除该文件,但在测试中它会收到0次。

2 个答案:

答案 0 :(得分:3)

根据您的规范,您似乎正在嘲笑和正确存根,但您从不致电check_status,因此存根和模拟不会被使用。您可以将示例更改为:

it 'deletes the file' do
  expect(File).to receive(:delete).with("test/status.txt")
  MyModel.check_status
end

最好还是使用实际文件而不是模拟和存根来测试它,以便它还测试文件位于正确的位置,您是否具有必要的权限等。

答案 1 :(得分:0)

更新问题

 File.delete('status.txt') if File.exist?('status.txt')

解决方案

context '#delete' do
    it 'deletes the file' do
      allow(File).to receive(:exist?).and_return(true)
      allow(File).to receive(:delete)
      expect(File).to receive(:delete).with("status.txt")
      # suppose check_status method is defined in TempClass
      delete = TempClass.new
      delete.check_status
    end
  end