1

Googleログインを含め、至る所で見られる「サインインしたままにする」機能のいくつかのrspecテストをどのように(そしてどこに)書くかについて、私は少し困惑しています。

Web で見つけた例はあまり役に立ちませんでした。具体的には、これら 2 つのシナリオをテストしたいと考えています。

1

  • a) ユーザーが [サインインしたままにする] をクリックせずに、有効な資格情報でサインインする
  • b) ユーザーがブラウザーを閉じてから再度開き、保護ページを要求します。
  • 保護されたページはユーザーに表示されません。
  • ユーザーには、サインインを求めるページが表示されます。

2

  • a) ユーザーが有効な資格情報を使用してサインインし、[サインインしたままにする] をクリックした
  • b) ユーザーがブラウザーを閉じてから再度開き、保護されたページを要求します。
  • サインインを求めるページがユーザーに表示されないようにする必要があります。
  • ユーザーは保護されたページに移動する必要があります。

この問題を解決するための最初の試みは、セッションに保存した user_id を削除してブラウザーを閉じることをシミュレートすることでした (ブラウザーを閉じると削除されるため)。ただし、リクエストスペックフォルダーで作業していて、セッション変数にアクセスできないため、これらのテストは失敗しました。私の以前の関連する質問:一部の rspec ファイルでセッションが利用可能で、他のファイルでは利用できません。どうして?

これらのテストをrspecで行う最良の方法は何ですか?

4

3 に答える 3

1

ここには 2 つの問題があり、異なるテストに属していると思います。

  1. ログインしていない場合、ユーザーは保護されたページにアクセスできません。これはコントローラーのテストです。
  2. セッションが破棄された後でも、Cookie に「remember」フラグが設定されている限り、ユーザーは自動的にログインします。

#1の場合、次のようなものを試すことができます:

describe UsersController do
  context "when not logged in" do
    context "GET users/edit" do
      it "redirects to login" do
        get :edit, :id => 123
        response.should redirect_to login_path
      end
    end
  end
end

明示的にリストされていないすべてのアクションをアサートする、より一般的なテスト ケースを作成できます。これにより、後でアクセス コードが誤ってより寛容になった場合にテスト ギャップが発生しなくなります。しかし、それはもっと微妙な点です。

#2 では、「remember me フラグ」を設定し、ログアウトしてから再度ログインし、期待したページに到達したことを確認するリクエスト仕様を作成できます。資格情報を入力し、[記憶する] ボックスをオンにして、ボタンをクリックすることで、ブラウザからこれらすべてを実行します。

質問は次のとおりです。なぜですか。なぜこれをテストしたいのですか?独自のログイン システムを使用していますか? あなたが一流のセキュリティ専門家でない限り、非常に落胆します. 自家製のシステムではなく、テスト済みのDeviseを使用している場合は、ライブラリの機能を再テストしないでください。#1でカバーされている特定のページへのアクセス権など、アプリケーションコードのみをテストしてください。また、Devise に付属のテストで、この状態をテストする方法を確認することもできます。

お役に立てれば。

更新#2 のリクエスト仕様を明確にします。@cutalion (正しい答えの功績に値する) による他の回答で述べたように、セッションを閉じてもログインが持続できることを確認するメカニズムは、open_session.

例を含むRails ドキュメントの IntegrationTest APIを参照してください。カスタム DSL の使用を拡張するブログ投稿。

于 2012-07-05T22:02:18.360 に答える
1

統合テストには、標準的な Rails メソッドを試してみるとよいと思いますopen_session
個人的に私はそれをしたことがなく、テスト済みのコードを提供することはできません。

Railsガイドの複数セッションの例を参照してください。

于 2012-07-05T22:09:34.397 に答える