2011-08-26 9 views
12

Chcę sprawdzić, czy metoda została wywołana dokładnie (n) razy, , ale Nadal chcę tej metody, aby wykonać swoją pierwotną funkcję. Rozważmy prosty system miniatur, który buforuje plik miniatury i upewnia się, że plik wykonywalny "convert" programu ImageMagick, który tworzy miniaturę, jest wywoływany tylko przy pierwszym żądaniu.rspec 2: Wykrywanie wywołania metody, ale nadal ma ona swoją funkcję

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 

W moim przypadku unikam mojej pierwszej próby, ale mogą być przypadki, w których nie. Druga nie powiedzie się, ponieważ wykryto wywołanie Thumbnail.convert, ale sama metoda niczego nie robi. Czy jest jakiś sposób, aby wykryć wezwanie do metody i sprawić, by była oryginalna?

BTW: Ja podejrzewam question jest bardzo podobny, ale potem zgubić w opisie, a także to bez odpowiedzi ...

Odpowiedz

20

Teraz jest and_call_original metoda właśnie w tym przypadku zastosowania. (RSpec 2,12)

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

Dokumentację można znaleźć na tej samej stronie wskazanej przez Joao here.

Zobacz także: changelog

+0

Dzięki, działało jak czar! – thomax

15

yay! Myślę, że to wymyśliłem!

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 

Jest udokumentowane (słabo, moim zdaniem) w here na samym końcu ...

+0

dokumentacja jest rzeczywiście słaba, i nie mogę znaleźć żadnego wymieniania 'original_method' w stronę, którą wskazał. Ale dzięki za odpowiedź! – lulalala

+0

'original_method' jest po prostu zmienną lokalną, której użyłem! Strona, do której podłączyłem, wspomina o "arbitralnej obsłudze", która jest mi potrzebna do wywołania metody zapisanej w tej zmiennej lokalnej. –

+0

o czym myślałem? Przepraszam, że nie przeczytałem tego poprawnie :( – lulalala