2016-12-11 13 views
1

온라인으로 조사를 해본 결과 내가 찾은 최선의 답변은 구형이거나 Android 용입니다. 어떤 도움을 주셔서 감사합니다!Firebase and Swift 3 비동기 단위 테스팅

내가 지난 주에 한 다른 프로젝트의 경우 Swift 2.3을 사용하여 사용자 지정 Heroku/PostGreSQL 백엔드에 대해 약 2 개의 테스트 사례를 작성해야했습니다. 내가 한 모든 것은 테스트 시작 부분에 asyncExpectation 변수를 만들고, 완료 핸들러가 실행 된 후 기대를 충족시킨 다음 테스트의 맨 아래에서 완료 될 때까지 기다리는 것입니다.

이제 Firebase와 Swift 3를 새 프로젝트에 사용하고 있습니다. 웬일인지 아래 asyncExpectation.fulfill()의 주석을 제거 할 때 데이터베이스에 아무것도 추가되지 않습니다. 그것이 밖으로 주석으로, 모든 것은 잘 작동합니다. Firebase와 Swift 3로 데이터 저장/검색을 테스트하려면 어떻게해야합니까?

편집 : 내가 온라인으로 연구하는 동안 포함시켜야 할 것은 디스패치를 ​​사용해야 할 수도 있다는 것을 알았지 만 중첩 된 completionHandlers에 대한 해결책 인 것 같습니다. 반면 데이터베이스 append은 꽤 completionHandler가 아니므로, 계속 진행하는 방법에 대한 손실이 있습니다.

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) 

이 코드가 맞다면 나도 몰라, 그냥 내 제안을 설명하는 것입니다 :

나는 당신이 뭔가를 값 만 설정을 검색하고 확인하는 것이 좋습니다.
도움이 되었기를 바랍니다.