Jestem nowy w Rails i RSpec i używam rspec przetestować tę metodę kontrolera, który zawiera obsługę wyjątków:Jak wywołać błąd przy użyciu Rspec w Railsach?
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
nie mogę dowiedzieć się, jak prawidłowo sprawdzić wspomnianą ścieżkę Po nieprawidłowym wyszukiwania (w przypadku otrzymania błędu) powinien przekierować na stronę główną. Próbowałem coś takiego:
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
Po uruchomieniu testu kończy się niepowodzeniem z błędem: NameError: uninitialized constant Movie::NoDirectorError
Jak fałszywy podnoszenie błąd w tym teście, więc faktycznie sprawdza czy przekierowanie dzieje?
Dzięki!
UPDATE:
Jak nzifnab wyjaśnił, że nie mógł zlokalizować Movie::NoDirectorError
. Zapomniałem zdefiniować tę klasę wyjątków. Więc dodałem go do app/models/movie.rb
:
class Movie < ActiveRecord::Base
class Movie::NoDirectorError < StandardError ; end
#some model methods
end
to rozwiązać mój problem i przechodzi ten test.
Masz rację, 'Movie :: NoDirectorError' nie został nigdzie zdefiniowany. Zdefiniowałem tę klasę wyjątków w 'app/models/movie.rb', a moje testy zostały teraz zatwierdzone. Dzięki! –