2012-04-07 14 views
6

estoy escribiendo la especificación para el regulador:RSpec. ¿Cómo verificar si se llama al método del objeto?

it 'should call the method that performs the movies search' do 
    movie = Movie.new 
    movie.should_receive(:search_similar) 
    get :find_similar, {:id => '1'} 
end 

y mi controlador parece:

def find_similar 
@movies = Movie.find(params[:id]).search_similar 
end 

después de ejecutar el rspec me sale el siguiente:

Failures: 
1) MoviesController searching by director name should call the method that performs the movies search 
Failure/Error: movie.should_receive(:search_similar) 
    (#<Movie:0xaa2a454>).search_similar(any args) 
     expected: 1 time 
     received: 0 times 
# ./spec/controllers/movies_controller_spec.rb:33:in `block (3 levels) in <top (required)>' 

que me parece para entender y aceptar, porque en mi código de controlador invoco el método de clase (película) y no veo ninguna forma de conectar "find_similar" con el objeto, creado en el spe do.

Entonces la pregunta es -> ¿cuál es la forma de comprobar si se llama al método en el objeto, creado en la especificación?

Respuesta

7
it 'should call the method that performs the movies search' do 
    movie = Movie.new 
    movie.should_receive(:search_similar) 
    Movie.should_receive(:find).and_return(movie) 
    get :find_similar, {:id => '1'} 
end 

Por qué vale la pena, estoy totalmente en contra de estos stub-all-cosas pruebas, simplemente hacen cambios de código más difíciles y en realidad están probando nada más que la estructura del código.

+0

ponen de acuerdo sobre el exceso de tropezar, visto demasiadas pruebas de comprobación de que el método funciona tropezar en lugar de comprobar que la aplicación funciona. – njorden

+0

nice one. aquí está la documentación sobre el condimento: https://www.relishapp.com/rspec/rspec-mocks/v/2-5/docs/message-expectations que necesitaba este bit obj.should_receive '(: Mensaje) .con ('more_than ',' one_argument ') ' – TomDunning

+0

uso interesante de las etiquetas" " – fotanus

0

Al principio, la película no se ha conservado todavía.

En segundo lugar, no un hecho, que tendrá un identificador 1

Así que trate de este

it 'should call the method that performs the movies search' do 
    movie = Movie.create 
    movie.should_receive(:search_similar) 
    get :find_similar, {:id => movie.id} 
end 
+0

gracias por "id", tiene toda la razón. sin embargo, la cuestión principal es todavía aquí, después de cambiar el código del mensaje es el mismo -> Insuficiencia/Error: movie.should_receive (: search_similar) (# ) search_similar (los argumentos) esperada: 1 vez. recibidas: 0 veces –

+0

es curioso que en la primera versión de la especificación 'Movie.find (params [: id])' 'no se levante RecordNotFound' .. – MikDiet

+0

hago cargar algunos objetos con accesorio, uno de los que: id = > '1' ... –

Cuestiones relacionadas