2

私の Rspec テストはすべて個別に合格していますが、スイート全体としては失敗しています。

で説明されているモック omniauth ハッシュの使用に問題を絞り込みましたspec/support/devise.rb

OmniAuth.config.test_mode = true

OmniAuth.config.mock_auth[:facebook] = {
  "uid" => "1111",
  "provider" => "facebook",
  "credentials" => {
    "token" => "token",
    "secret" => "secret"
  },
  "extra" => {
    "raw_info" => {
      "name" => "Adam Waite",
      "username" => "adamjwaite",
      "email" => "adam@adam.com"
    }
  }
}

OmniAuth.config.add_mock(:facebook, OmniAuth.config.mock_auth[:facebook])

テストが失敗するOmniAuth.config.mock_auth[:facebook]直前に ( pry:invalid_credentialsを使用して)調べると、スイートで実行すると返されます。個々のテスト ファイルで同じテストを実行すると、表示どおりに表示されます。

my の登録メソッドで失敗したテストは次のUsersControllerとおりです。

describe "GET :new" do
  describe "as an unauthenticated user with a facebook omniauth session" do
    before do
      session[:omniauth_facebook] = OmniAuth.config.mock_auth[:facebook]
      get :new
    end
    specify { assigns[:registering_with_facebook].should == true }
    specify { assigns[:registering_with_twitter].should == false }
    specify { response.should be_success }
  end
end

アプリケーションも正しく機能することにも言及する価値があります。スイートを通過させたいだけです。

何が起こっているのかについて誰か光を当てていますか?

4

1 に答える 1

4

テストが単独では機能するが、他のテストで失敗する場合は常に、テストの順序付けの問題があります。一部の以前のテストでは、グローバル状態が変更され、そのままになっているため、このテストに悪影響を及ぼしています。

自分のスイートで順序付けの問題を見つけるのに役立つ小さなツールを作成しました: rspec-search-and-destroy。テスト スイートを取り、悪いグローバル状態を設定している 1 つのテストが見つかるまで分割します。もちろん、これは自分で手動で行うこともできますが、うまくいけば、このツールによって単調な作業が自動化されます。

以前のテストを見つけたら、それを検査して、どのグローバル状態が設定されているか、およびその変更を必要とするテストだけに適切にサンドボックス化する方法を把握する必要があります。

于 2013-10-26T13:59:04.710 に答える