我想知道如何在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次。
答案 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