4

before_filter でリダイレクトが発生することなく、コントローラー アクションが実際に呼び出されるかどうかをテストしたいと思います。コントローラー アクション自体がリダイレクトを実行する可能性があるため、アクションをスタブして特定のエラー (SuccessfulActionError など) を発生させ、メソッドが呼び出されたことを示すインジケーターとしてそのエラーをチェックします。

だから私は以下を追加しました:

controller.stub!(:action).and_raise(SuccessfulActionError)

何らかの形で機能し、例外が発生していますが、メソッド内の実際のコードは引き続き実行されます (たとえば、存在しないレコードの ID を「表示」アクションに送信すると、ActiveRecord::RecordNotFound 例外がスローされます) )。

何故ですか?として実装されているかのように、アクションを完全にスタブしたい

def action
  raise SuccessfulActionError
end

私は何を間違っていますか?これは間違ったアプローチですか?

編集:

使用する

controller.should_receive(:action)

どちらも機能しません。

ApplicationController から取得されない default_url_options を修正するために、このように before_all フィルターで Controller を上書きします。

class MyController
  def default_url_options(options = {})
    { :locale => params[:locale] }
  end
end

それが犯人でしょうか?残念ながら、それを削除すると、仕様はまったく機能しません。

4

1 に答える 1

0

メソッドをスタブ化した後に ActiveRecord::RecordNotFound 例外を取得する方法がわかりません。スタブはメソッド呼び出しを置き換える必要があります。

別のアプローチとして、アクションにメッセージの期待値を設定することを検討できます。

controller.should_receive(:show)
get :show

before_filter がアクションの呼び出しを妨げている場合、これは失敗するはずです。

于 2011-03-06T10:12:24.710 に答える