2017-08-07 74 views
1

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

+0

我想你可以检查文件是否仍然存在后删除。允许(File).to接收(:exists?)。and_return(false)' –

+0

您的建议将始终返回true,因为我有代码:allow(File).to receive(:exist?)。and_return(true)。我想检查是否在特定文件上调用删除。 – ivan

+1

你在哪儿叫'check_status'? – Anthony

回答

3

从您的规格看来,您似乎正在嘲笑和剔除,但您永远不会拨打check_status,所以存根和嘲笑不会被使用。您可以将您的例子更改为类似:

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

这将是更好还是用实际的文件来测试这一点,而不是嘲弄和存根,因此,它也测试该文件是在正确的位置,即你有必要的权限等

+0

有调用'check_status'之前设定的预期(S)(或使用间谍和'have_received') – Stefan

+0

嗨,不幸的是,这不适合我。我之前尝试过。 – ivan

+0

MyModel具有方法运行,该方法调用私有的方法check_status。我无法执行类似MyModel.check_status – ivan