2011-08-26 11 views
12

Voglio verificare se un metodo è stato chiamato esattamente (n) volte, ma Desidero comunque che quel metodo esegua la sua funzione originale. Si consideri un semplice sistema di thumbnailing che memorizza nella cache il file di anteprima e si assicura che l'eseguibile "convert" di ImageMagick che crea la miniatura venga chiamato solo alla prima richiesta.rspec 2: rileva la chiamata al metodo ma continua a farlo funzionare

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 

Nel mio caso ho farla franca con il mio primo tentativo, ma ci potrebbero essere casi in cui non lo faccio. Il secondo non riesce perché viene rilevata la chiamata Thumbnail.convert ma il metodo stesso non esegue alcuna operazione. C'è un modo per rilevare solo la chiamata al metodo e farlo fare è la cosa originale?

BTW: ho il sospetto che questo question è molto simile, ma poi mi perdo nella descrizione e anche che è senza risposta ...

risposta

20

Ora c'è un metodo and_call_original proprio per questo caso d'uso. (RSpec 2,12)

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

La documentazione può essere trovato sulla stessa pagina a cui fa riferimento Joao, here.

Consulta anche: il changelog

+0

Grazie, ha funzionato come un fascino! – thomax

15

Yay! Penso di aver capito!

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 

E 'documentato (male, a mio parere) in here proprio alla fine ...

+0

la documentazione è davvero scarsa, e non riesco a trovare alcuna menzione di 'original_method' nella pagina che si indicò. Ma grazie per la risposta! – lulalala

+0

'original_method' è solo una variabile locale che ho usato! La pagina che ho collegato menziona "gestione arbitraria", che è quello che dovevo chiamare il metodo memorizzato in quella variabile locale. –

+0

cosa stavo pensando? Mi spiace di non averlo letto correttamente :( – lulalala

Problemi correlati