7

機能テストでフラッシュメッセージを確認する方法がわかりません。私の問題は、 DOESredirect_toのテストに合格したために関係があります。flash[:error]私のcreate行動は次のようになります。

def create
  @user = User.new(params[:user])
  if @user.save
    redirect_to @user, flash: { success: "Welcome!" }
  else
    flash.now[:error] = "Signup failed:"
    render 'new'
  end
end

1 flash[:error]flash[:error]正しい値であることを確認し、2)フラッシュdivのページを確認し、3)新しいページを取得して、フラッシュメッセージがクリアされたことを確認します。の類似のテストを試みましたflash[:success]が、ページでdivを見つけようとすると失敗します。失敗したテストは次のとおりです。

  should "show flash[:success] message" do
    post :create, user: { name: "valid user",
                          password: "userpw",
                          password_confirmation: "userpw",
                          email: "a@b.com" }        
    assert_redirected_to user_path(assigns(:user)), "user isn't being redirected to their page after registration"
    assert_equal flash[:success], "Welcome!", "flash[:success] isn't being set properly"
    assert_select "div.alert-success", flash[:success]
    get :new
    assert flash.empty?, "there shouldn't be any flash messages left after getting new page"
  end

これをブラウザで手動でテストすると、期待どおりに動作しますが、これを反映するようにテストを作成する方法がわかりません。最初の2つのアサーションは合格です(したがって、テストは正しくリダイレ​​クトされていることを認識し、flash[:success]に設定されてい"Welcome!"ます)。assert_selectこれに基づいて、ステートメントはdivを見つけることができると思いますが、失敗した場合は次のエラーメッセージが表示されます。

Expected at least 1 element matching "div.alert-success", found 0.

だから私はこれを印刷しputs @response.bodyたステートメントの直前に追加しようとしました:assert_select

<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>

これは、フラッシュdivが見つからなかった理由を説明していますが、フラッシュdivで正しいビューをレンダリングするようにリダイレクトを「終了」する方法がわかりません。getステートメントの直前にステートメントを追加すると、フラッシュdivがあるassert_selectため、テストに合格します。@response.bodyただし、これは私のアプリケーションの動作を反映していないため、効果的なテストとは思えません。ユーザーはフラッシュメッセージを表示するために新しい要求を行う必要はありません。

また、フラッシュメッセージが正しいページに表示されることを保証するものではありません。ステートメントを使用するget :newと、アサーションは引き続き渡されます。これは、フラッシュメッセージがusers#newビューに表示されることを意味します。使っても

get :show, id: assigns(:user).id  

フラッシュメッセージが正しいページに表示されることを確認するために、これはまだ間違っていると感じます。これは、1)応答ではsuccessなくredirect応答になり、2)ページを見つけるために手動でページを要求する必要がある理由がまだ説明されていないためです。 flash div-ドキュメントによると、「フラッシュはセッションの特別な部分であり、リクエストごとにクリアされます。

とにかく、リダイレクト後にフラッシュメッセージが正しく表示されることをテストする方法はありますか?

4

1 に答える 1

3

私はあなたがテストしようとしているものは他の場所でよりよくテストされるだろうというPOVからのこの質問に答えています。テストの設定で多くの問題が発生している場合は、テストするためのより良い方法がある可能性があります:)

  1. フラッシュメッセージがクリアされるかどうかのテスト-フラッシュメッセージはRailsに組み込まれているため、フレームワークが処理しているものをテストすることはあまり意味がありません。

  2. 要素がページに表示されることをテストします-ビューの仕様はコントローラーに属していません。コントローラの役割の説明は次のとおりです。

    したがって、コントローラーは、モデルとビューの間の仲介者と考えることができます。モデルデータをビューで使用できるようにするため、そのデータをユーザーに表示できます。

    コントローラは、データのレンダリング方法を指定するのではなく、ビューでデータを利用できるようにすることになっています。CSSクラスの名前を変更した場合、コントローラーの仕様も更新する必要があると想像してください。

    フラッシュメッセージが表示されることを本当にテストしたい場合は、統合テストを使用します。

于 2012-12-16T01:52:55.863 に答える