2017-08-07 40 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