16

私はRailsとRspecが初めてで、Rspecを使用して、例外処理を含むこのコントローラーメソッドをテストしています:

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

上記のパスを正しくテストする方法がわかりません。無効な検索の後 (エラーが発生した場合)、ホームページにリダイレクトする必要があります。私はこのようなことを試しました:

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

テストを実行すると、次のエラーで失敗します。 NameError: uninitialized constant Movie::NoDirectorError

このテストでエラーを発生させて、実際にリダイレクトが発生するかどうかを確認する方法は?

ありがとう!

アップデート:

nzifnab が説明したように、見つけることができませんでしMovie::NoDirectorErrorた。この例外クラスを定義するのを忘れていました。だから私はそれを追加しましたapp/models/movie.rb

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

これで問題が解決し、このテストは成功しました。

4

3 に答える 3

19

あなたはとても近くにいます。そこに追加する必要がany_instanceあります。

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

編集:投稿を読み違えました。上記は Movie のインスタンスでは機能しますが、OPの質問では機能しません。

于 2013-02-18T18:35:28.010 に答える
12

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

constant missingRails は、従来のファイル ディレクトリ形式を使用して、定数を自動的に見つけようとします。定数の名前に基づいて、 load_pathat内のファイルを探します。ファイルが見つからない場合、またはファイルが期待される定数を定義していない場合は、ファイルを自分で明確に要求する必要があります。movie/no_director_errormovie

于 2013-02-18T18:37:37.267 に答える
0

Rails 4.1 では:

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

verse_selector.select_versesを返すようになりましたActiveRecord::RecordNotFound

于 2014-07-10T12:33:53.210 に答える