2016-12-11 14 views
1

Итак, я провел некоторое исследование в Интернете, и лучшие ответы, которые я нашел, либо устарели, либо предназначены для Android. Любая помощь приветствуется!Испытание асинхронного устройства Firebase и Swift 3

Для другого проекта, который я сделал в течение прошлой недели, мне пришлось написать около 2 дюжин тестовых примеров для пользовательского бэкэда Heroku/PostGreSQL с Swift 2.3. Все, что я сделал, это создать переменную asyncExpectation в начале теста, выполнить ожидание после выполнения обработчика завершения, а затем дождаться, когда оно будет выполнено в нижней части теста.

Теперь я использую Firebase и Swift 3 для нового проекта. По какой-то причине в базу данных ничего не добавляется, когда я раскомментирую asyncExpectation.fulfill() ниже. С его комментариями все работает нормально. Как мне пойти на тестирование хранения/извлечения данных с помощью Firebase и Swift 3?

Редактировать: Я должен добавить, что среди моих исследований в Интернете я обнаружил, что мне может понадобиться диспетчеризация, но это похоже на решение для вложенных завершенийHandlers, тогда как моя база данных 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) 
     } 
    } 
} 
+0

Вы пытались установить более высокий тайм-аут? – Zeb

+0

Да, я пробовал это. Тайм-аут, похоже, не является проблемой. Это хорошее предложение, потому что это объясняет, почему удаление expect.fulfill() заставляет его работать. Я сделал это 30 секунд, и он все равно не сработает. Когда я удаляю выполнение, для добавления данных в бэкэнд требуется только 5 секунд. –

+0

Вы взглянули на мой ответ? Правильно ли это? – Zeb

ответ

0

, на мой взгляд, ваша проблема заключается в том, что вы проверяете успех setValue в обработчике ожидания. Как описано в документации, обработчик вызывается только в случае тайм-аута:

блок, который будет вызван, когда вызов -waitForExpectationsWithTimeout: обработчик: тайм-аут или имел все связанные с ним ожидания исполнились.

Я предлагаю вам получить значение только установить и проверить его, что-то вроде этого:

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

Я не знаю, если этот код является правильным, это просто объяснить мое предложение.
Надеюсь, это полезно!