2016-12-11 13 views
1

私はオンラインでいくつかのリサーチを行いました。私が見つけた最良の回答は古くなっているか、Android向けです。どんな助けもありがとう!FirebaseとSwift 3非同期ユニットテスト

私が先週行った別のプロジェクトでは、Swift 2.3を使用したカスタムHeroku/PostGreSQLバックエンドのテストケースを約2ダース作成する必要がありました。私がしたのは、テストの開始時にasyncExpectation変数を作成し、完了ハンドラを実行した後に期待通りに実行してから、テストの最後に完了するまで待ってください。

私はFirebaseとSwift 3を新しいプロジェクトに使用しています。何らかの理由で、以下のasyncExpectation.fulfill()のコメントを外すと、データベースに何も追加されません。それがコメントアウトされて、すべて正常に動作します。 FirebaseとSwift 3でデータの保存/取り出しをテストするにはどうすればよいですか?

編集:私は私がオンラインリサーチなか、私は私が派遣使用する必要があるかもしれませんが、私のデータベースappend方法はかなりcompletionHandlerないのに対し、これは、ネストされたcompletionHandlersのためのソリューションのように思えることを明らかにすることを含まなければならないので、私は」どのように進行するかについては紛失している。

class RooMate_v2Tests: XCTestCase { 
    func testCreateUser() { 

     let asyncExpectation = expectation(description: "createUserTestOne") 
     var testSuccess = false 

     let testUser = (email: "TESTUSER|" + String().randomString(length: 6) + "@test.com", password: String().randomString(length: 6), firstName: "jimmy", lastName: "jenkins") 

     FIRAuth.auth()?.createUser(withEmail: testUser.email, password: testUser.password) { (user, error) in 
      if error != nil { 
      print("Error: \(error.debugDescription)") 
      } else { 
      let userProfileInfo = ["firstName" : testUser.firstName, 
            "lastName" : testUser.lastName, 
            "email" : testUser.email, 
            "profilePictureURL" : "N/A"] 

       let backendRef = FIRDatabase.database().reference()     
       backendRef.child("users").child("TESTUSER|" + user!.uid).setValue(userProfileInfo) 
       // testSuccess = true 
      } 
      // asyncExpectation.fulfill() 
     } 

     waitForExpectations(timeout: 10) { (error) in 
      XCTAssertTrue(testSuccess) 
     } 
    } 
} 
+0

タイムアウトをより高く設定しようとしましたか? – Zeb

+0

はい、私はそれを試みました。タイムアウトは問題ではないようです。これは、expectation.fulfill()を削除してもうまく動作する理由を説明するので、良い提案です。私はそれを30秒間作ったが、それはまだ動作しません。フルフィルメントを削除すると、バックエンドにデータを追加するのに約5秒しかかかりません。 –

+0

あなたは私の答えを見ましたか?それが正しいか? – Zeb

答えて

0

私の意見では、あなたの問題は、待機のハンドラでsetValueの成功をチェックしていることです。マニュアルに記載されているように、ハンドラは唯一の時間外の場合に呼び出されます。

-waitForExpectationsWithTimeoutへの呼び出し呼び出されるブロック:ハンドラ:タイムアウトするか満たさ、関連するすべての期待を持っていました。

私は、あなただけの設定値を取得し、それをチェックするために、このようなものをお勧め:このコードが正しいかどうかはわからない、それはちょうど私の提案を説明することである

let retrievedUserProfile = backendRef.child("users").child("TESTUSER|" + user!.uid) 
XCTAssertTrue(retrievedUserProfile == userProfileInfo) 

を。
私はそれが役に立ちそうです!

関連する問題