2011-08-26 6 views
12

Quiero comprobar si un método fue llamado exactamente (n) veces, pero Todavía quiero que ese método realice su función original. Considere un sencillo sistema de miniaturas que almacena en caché el archivo de miniaturas y asegúrese de que el ejecutable de "conversión" de ImageMagick que crea la miniatura solo se invoque en la primera solicitud.rspec 2: detecta la llamada al método pero aún así tiene que realizar su función

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 

En mi caso me escapo con mi primer intento, pero podría haber casos en que no lo haga. El segundo falla porque se detecta la llamada Thumbnail.convert pero el método en sí no hace nada. ¿Hay alguna forma de detectar la llamada al método y hacer que sea original?

Por cierto: Sospecho que esto question es muy similar, pero luego se pierden en la descripción y también es sin respuesta ...

Respuesta

20

Ahora hay un método and_call_original precisamente para este caso de uso. (RSpec 2,12)

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

La documentación se puede encontrar en la misma página referenciado por Joao, here.

Consulte también: el changelog

+0

¡Gracias, trabajado como un encanto! – thomax

15

Yay! ¡Creo que lo descubrí!

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 

Está documentado (mal, en mi opinión) en here al final ...

+0

la documentación es de hecho pobre, y no puedo encontrar ninguna mención de 'original_method' en la página que apuntaban a. ¡Pero gracias por la respuesta! – lulalala

+0

'original_method' es solo una variable local que utilicé! La página que he vinculado menciona "manejo arbitrario", que es lo que necesitaba para llamar al método almacenado en esa variable local. –

+0

¿qué estaba pensando? Lo siento, no lo leí correctamente :( – lulalala

Cuestiones relacionadas