7

ユーザーが に/auth/facebookアクセスすると、FB にリダイレクトされ、成功した場合は my に戻り/auth/facebook/callbackます。

これらすべてのリダイレクトに従ってユーザーが認証されたことを確認する RSpec テストを作成するにはどうすればよいですか?

4

1 に答える 1

6

別のより単純なアプローチをお勧めします。コールバックコントローラーを直接テストして、omniauth.auth で渡されたさまざまな値にどのように反応するかを確認した場合、または env["omniauth.auth"] が欠落しているか正しくない場合はどうなるでしょうか。リダイレクトに従うことは、システムをテストしない omniauth プラグインをテストすることと同じです。

たとえば、これが私たちのテストで得られたものです (これはほんの数例です。サインイン試行前の omniauth ハッシュとユーザー状態の他のバリエーション (招待ステータス、無効になっているユーザー アカウントなど) を検証するものは他にもたくさんあります)。管理者など):

describe Users::OmniauthCallbacksController do
  before :each do
    # This a Devise specific thing for functional tests. See https://github.com/plataformatec/devise/issues/608
    request.env["devise.mapping"] = Devise.mappings[:user]
  end
  describe ".create" do

    it "should redirect back to sign_up page with an error when omniauth.auth is missing" do
      @controller.stub!(:env).and_return({"some_other_key" => "some_other_value"})
      get :facebook
      flash[:error].should be
      flash[:error].should match /Unexpected response from Facebook\./
      response.should redirect_to new_user_registration_url
    end

    it "should redirect back to sign_up page with an error when provider is missing" do
      stub_env_for_omniauth(nil)
      get :facebook
      flash[:error].should be
      flash[:error].should match /Unexpected response from Facebook: Provider information is missing/
      response.should redirect_to new_user_registration_url
    end
  end
end

メソッドは次のようにstub_env_for_omniauth定義されます。

def stub_env_for_omniauth(provider = "facebook", uid = "1234567", email = "bob@contoso.com", name = "John Doe")
  env = { "omniauth.auth" => { "provider" => provider, "uid" => uid, "info" => { "email" => email, "name" => name } } }
  @controller.stub!(:env).and_return(env)
  env
end
于 2012-09-22T20:21:38.930 に答える