機能テストでフラッシュメッセージを確認する方法がわかりません。私の問題は、 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-ドキュメントによると、「フラッシュはセッションの特別な部分であり、リクエストごとにクリアされます。」
とにかく、リダイレクト後にフラッシュメッセージが正しく表示されることをテストする方法はありますか?