2011-08-26 37 views
12

我想檢查一個方法是否被調用完全(n)次,我仍然希望該方法執行其原始功能。考慮一個簡單的縮略圖系統緩存縮略圖文件,並確保ImageMagick的創建縮略圖的「轉換」可執行文件僅在第一個請求上被調用。rspec 2:檢測調用方法,但仍然有它執行其功能

it "this passes: should detect a cached version" do 
    thumbnail_url = thumbnail_url_for("images/something.jpg") 
    get thumbnail_url 
    last_response.should be_ok 
    Sinatra::Thumbnail.should_not_receive(:convert) 
    get thumbnail_url 
    last_response.should be_ok 
    end 

    it "this fails: should detect a cached version" do 
    Sinatra::Thumbnail.should_receive(:convert).exactly(1).times 
    thumbnail_url = thumbnail_url_for("images/something.jpg") 
    get thumbnail_url 
    last_response.should be_ok 
    get thumbnail_url 
    last_response.should be_ok 
end 

在我的情況下,我逃離了第一次嘗試,但可能有情況下,我沒有。第二個失敗,因爲檢測到呼叫Thumbnail.convert,但該方法本身不起任何作用。有沒有什麼辦法來檢測方法的調用,並讓它做到原來的東西?

BTW:我懷疑這是question非常相似,但後來我得到了描述丟失,也很沒有答案......

回答

20

現在,有一種方法and_call_original正是因爲這個用例。 (RSpec的2.12)

Sinatra::Thumbnails.should_receive(:convert).and_call_original 

的文檔可以通過若昂,here引用的同一頁面上找到。

參見:changelog

+0

謝謝,像一個魅力工作! – thomax

15

耶!我想我明白了!

it "should detect a cached version" do 
    original_method = Sinatra::Thumbnails.method(:convert) 
    Sinatra::Thumbnails.should_receive(:convert).exactly(1).times do |*args| 
    original_method.call(*args) 
    end 
    thumbnail_url = thumbnail_url_for("images/something.jpg") # 
    get thumbnail_url 
    last_response.should be_ok 
    get thumbnail_url 
    last_response.should be_ok 
end 

它的記錄(糟糕,在我看來)在here在最後...

+0

的文件確實是很差,我無法找到你指着頁面'original_method'的任何提及。但謝謝你的答案! – lulalala

+0

'original_method'只是我使用的局部變量!我鏈接到的頁面提到「任意處理」,這是我需要調用存儲在該局部變量中的方法。 –

+0

我在想什麼?對不起,我沒有正確閱讀:( – lulalala

相關問題