2013-02-18 16 views
14

私はRailsとRSpecのに新たなんだと私は例外処理が含まれ、このコントローラのメソッドをテストするためにはRSpecを使用しています:Railsを使ってRailsでエラーをスタブする方法はありますか?

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 

私が正しく言ったパスをテストする方法を見つけ出すことはできません:無効な検索後(エラーを受け取った場合)、ホームページにリダイレクトする必要があります。それは実際にリダイレクトが発生したかどうかをチェックして、偽のは、このテストでエラーを上げる方法NameError: uninitialized constant Movie::NoDirectorError

:テストを実行した後

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 

がエラーで失敗します。私はこのような何かを試してみましたか?

ありがとうございます!

UPDATE: nzifnabが説明したように

、それはMovie::NoDirectorErrorを見つけることができませんでした。私はこの例外クラスを定義するのを忘れていました。だから私はapp/models/movie.rbにこれを追加しました:これは私の問題を解決し、このテストは合格

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

答えて

11

エラーは、Movie::NoDirectorError例外クラスが定義されている場所がわからないことを示します。そのクラスが定義されているファイルを具体的にrequireにする必要があるか、テストで見つけられないことがあります。

従来のファイルディレクトリ形式を使用して、constant missingの定数を自動的に検索しようとします。定数の名前に基づいて、のファイルをmovie/no_director_errormovieに探します。ファイルが見つからないか、ファイルが予想される定数を定義していない場合は、特にファイルを自分で必要とする必要があります。 Railsの4.1に

+0

あなたは正しいです、 'Movie :: NoDirectorError'はどこにも定義されていませんでした。私はこの例外クラスを 'app/models/movie.rb'で定義しました。ありがとう! –

18

あなたは非常に近いです。そこにany_instanceを追加する必要があります。

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

編集:私は投稿を誤読しました。上記は映画のインスタンスを与えても動作しますが、OPの質問には当てはまりません。

+1

を返しますが、それはクラスメソッドです。彼は正しい。 – nzifnab

+0

any_instanceを追加するだけではうまくいきませんでしたが、同じエラーが発生しました。 –

+0

Doh。あなたが正しい。私は物事を誤読した。私を無視。 –

0

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

verse_selector.select_versesは今、それは彼が使っているインスタンスメソッドではありませんActiveRecord::RecordNotFound

関連する問題