with tutorial tests test run rails how ruby-on-rails ruby unit-testing rspec stubbing

ruby-on-rails - tutorial - rspec with rails



¿Cómo resguardar el error al usar Rspec en Rails? (3)

Soy nuevo en Rails y Rspec y estoy usando Rspec para probar este método de control que incluye el manejo de excepciones:

def search_movies_director @current_movie = Movie.find(params[:id]) begin @movies = Movie.find_movies_director(params[:id]) rescue Movie::NoDirectorError flash[:warning] = "#{@current_movie} has no director info" redirect_to movies_path end end

No puedo encontrar la forma de probar correctamente dicha ruta: después de la búsqueda no válida (cuando se recibe el error) debe redirigir a la página de inicio. Intenté algo como esto:

describe MoviesController do describe ''Finding Movies With Same Director'' do #some other code context ''after invalid search'' do it ''should redirect to the homepage'' do Movie.stub(:find) Movie.stub(:find_movies_director).and_raise(Movie::NoDirectorError) get :search_movies_director, {:id => ''1''} response.should redirect_to movies_path end end end end

Después de ejecutar la prueba falla con un error: NameError: uninitialized constant Movie::NoDirectorError

¿Cómo falsificar la aparición de un error en esta prueba para que realmente compruebe si ocurre la redirección?

¡Gracias!

ACTUALIZAR:

Como explicó nzifnab, no pudo ubicar Movie::NoDirectorError . Olvidé definir esta clase de excepción. Así que lo agregué a la app/models/movie.rb :

class Movie < ActiveRecord::Base class Movie::NoDirectorError < StandardError ; end #some model methods end

Esto resolvió mi problema y esta prueba pasa.


El error indica que no sabe dónde está definida Movie::NoDirectorError clase de excepción Movie::NoDirectorError . Es posible que necesite require específicamente el archivo donde se define esa clase o la prueba no podrá encontrarlo.

Rails automáticamente intentará localizar constant missing constantes utilizando un formato de directorio de archivos convencional. load_path un archivo en load_path en movie/no_director_error y movie basado en el nombre de la constante. Si no se encuentra el archivo o si el archivo no define la constante esperada, necesitará especificar el archivo usted mismo.


Estás muy cerca. Necesitas agregar any_instance allí.

Movie.any_instance.stub(:find_movies_director).and_raise(Movie::NoDirectorError)

editar: Leí mal la publicación. Lo anterior funcionaría dado un ejemplo de Película, pero no para la pregunta de OP.


En Rails 4.1:

verse_selector = double("VerseSelector", select_verses: ActiveRecord::RecordNotFound.new("Verses not found"))

verse_selector.select_verses ahora devolverá un ActiveRecord::RecordNotFound