Firebase和Swift 3异步单元测试

时间:2016-12-11 21:35:29

标签: ios swift firebase swift3 firebase-authentication

所以我在网上做了一些研究,我发现的最佳答案要么是过时的,要么是针对Android的。任何帮助表示赞赏!

对于我上周所做的另一个项目,我不得不用Swift 2.3为自定义Heroku / PostGreSQL后端编写大约24个测试用例。我所做的只是在测试开始时创建一个asyncExpectation变量,在执行完成处理程序后满足期望,然后等待它在测试的底部完成。

现在我正在使用Firebase和Swift 3进行新项目。出于某种原因,当我取消注释下面的asyncExpectation.fulfill()时,没有任何内容添加到数据库中。随着它的注释,一切正常。我应该如何使用Firebase和Swift 3测试数据存储/检索?

编辑:我应该在我的在线研究中加入,我发现我可能需要使用调度,但这似乎是嵌套的completionHandlers的解决方案,而我的数据库append方法不是一个完整的Handler,所以我不知道如何继续。

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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在我看来,你的问题是你在等待的处理程序中检查setValue的成功。如文档中所述,仅在超时的情况下调用处理程序

  

调用时要调用的块   -waitForExpectationsWithTimeout:handler:超时或已满足所有相关期望。

我建议您检索刚刚设置的值并检查它,如下所示:

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

我不知道这段代码是否正确,只是为了解释我的建议 我希望它有用!

相关问题