2013-02-18 14 views
14

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.

Odpowiedz

11

Błąd wskazuje, że nie wie, gdzie zdefiniowano tę klasę wyjątków Movie::NoDirectorError. Może być konieczne szczegółowe określenie pliku, w którym zdefiniowana jest ta klasa lub test może nie być w stanie go znaleźć.

Railsy automatycznie spróbują zlokalizować stałe constant missing przy użyciu konwencjonalnego formatu katalogu plików. Będzie szukać pliku w load_path pod i movie na podstawie nazwy stałej. Jeśli plik nie zostanie znaleziony lub plik nie definiuje oczekiwanej stałej, musisz sam konkretnie zażądać tego pliku.

+0

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! –

18

Jesteś bardzo blisko. Musisz tam dodać any_instance.

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

edytuj: źle odczytałem wpis. Powyższe zadziała w przypadku filmu, ale nie w przypadku PO.

+1

to nie jest metoda instancji on używa, jest to metoda klasy. Ma to poprawne. – nzifnab

+0

Po prostu dodanie any_instance nie działa dla mnie, wciąż otrzymuję ten sam błąd. –

+0

Doh. Masz rację. Źle czytam rzeczy. Ignoruj ​​mnie. –

0

W Rails 4.1:

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

verse_selector.select_verses będzie teraz zwracać ActiveRecord::RecordNotFound

Powiązane problemy