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