Rails で Cookie 値のクリアをテストしていますか?
-
06-09-2019 - |
質問
機能テストで Cookie を送信するにはどうすればよいですか?Cookie がクリアされていることを確認するにはどうすればよいですか?
私は TDD を使用して Rails アプリケーションのモデルを構築することに大きな成功を収めてきましたが、コントローラーのテストに関して障害に遭遇しました。テスト中に Cookie の値を 1 回設定して読み取ることはできますが、クリアすることはできません。あれは:
test "clears cookie" do
get :set_it, :stuff => {'key' => 'value'} # stuff to cookify
assert cookies['key'] == 'value' # works fine
get :clear_it # cookie doesn't get sent. How do I simulate this?
assert nil == cookies['key'], 'Cookie not cleared' # fails
end
Rails テスト ガイドには、テストで Cookie の送信をシミュレートする方法については記載されておらず、データがサーバーに設定されたことを確認する方法についてのみ記載されています。以前、応答が送信されるまでサーバー上の Cookie データが変更されない状況に遭遇したことがあります。それがここで起こっていることですか?私は、機能テストが「クライアントになる」という点でもっとうまく機能していればいいのにと少し期待していました。
これは広く知られている問題ですか?人々はこの種の目的で JUnit を使用することをただ諦めているのでしょうか?1 つのフレームワークを次の目的で使用できるようにしたいと思っています。 全部またはほぼ全部 私のTDDの。
まったくの絶望と推測の結果、私は楽観的に @response.cookies を試してみましたが、それもうまくいきませんでした。
解決
特に Cookie の設定解除に関する単体テストを行いたい場合は、Cookie を何も設定しないヘッダーが応答に含まれているかどうかを実際にテストすることになります。私はあなたのことを想定しています get :clear_it
やってる cookies.delete :cookie-name
. 。これにより、response.header が次のように設定されます。 Set-[COOKIE-NAME]=;
. 。したがって、他のメソッドが失敗した場合は、その文字列を直接検索するだけで済みます。
コードで怪しいと思われるのは、単にチェックしているだけということです cookies
直接。「get」リクエストからの応答はどこへ行くのでしょうか?
他のすべてが失敗した場合は、説明したように webrat との統合テストを使用することもできます。 ここ. 。これは単体テストほど優れたものではないかもしれませんが、少なくとも機能をチェックします。
他のヒント
私のログアウトテストが持っていた。
assert_nil @response.cookies["auth_token"]
働きます。
nilでない場合は、あなたはどのような値を取得していますか?