我有一個函數,它接受一個塊,打開一個文件,收益率和回報:如何測試一個函數,它接受一個塊使用RSpec
def start &block
.....do some stuff
File.open("filename", "w") do |f|
f.write("something")
....do some more stuff
yield
end
end
我試圖寫一個測試使用RSpec的它。如何將File.open存根以便它將一個對象f(由我提供)傳遞給該塊而不是試圖打開實際文件?喜歡的東西:
it "should test something" do
myobject = double("File", {'write' => true})
File.should_receive(:open).with(&blk) do |myobject|
f.should_receive(:write)
blk.should_receive(:yield) (or somethig like that)
end
end
很難對此進行測試,因爲您想要測試的是該方法的內部。你的文件如何與方法外的任何東西進行交互?在你的例子中,你根本不會在方法外部使用這個文件,也不會產生它。如果這個函數之外的東西需要該文件,那麼也許你應該考慮將文件對象傳遞給方法(依賴注入)。然後你可以模擬文件沒問題。如果你確實需要測試一下這個文件,也許你應該考慮把它分解成一個單獨的方法? – Raj 2013-02-27 01:03:34
謝謝...做了這樣的事情,分解成多個方法,像File.stub(打開).and_yield(my_double)等殘存幾個功能。 – constantine1 2013-03-05 09:07:48