Arm1.ru

Tag: «xctest»

Тестирование асинхронного кода в XCTest

Пока писал тесты в приложении, столкнулся с тем, что не работают тесты, в которых есть асинхронный код. Например, если мы делаем асинхронный запрос в сеть и callback-блоке проверяем то, что получилось. Проверки просто не выболнялись и Xcode говорил, что тест удачно пройден, даже если он заведомо не должен пройти. 

В ходе гугления оказалось два решения - одно через семафоры из Grand Central Dispatch, воторое с помощью expectations. С expectations мне понравилось больше. Пример теста:

import XCTest

class apiClientTests: XCTestCase {
  override func setUp() {
    super.setUp()
  }

  override func tearDown() {
    super.tearDown()
  }

  /**
  SampleTest
  */
  func testSampleAsyncRequest() {
    let exp = expectationWithDescription("\(#function)\(#line)")

    APIClient.sharedInstance.someMethod { (responseObject, error) in
      XCTAssertNotNil(responseObject, "responseObject should not be nil")
      XCTAssertNil(error, "error should be nil")

      exp.fulfill()
    }

    waitForExpectationsWithTimeout(40) { (error) in
      if error != nil {
        XCTAssertTrue(false)
      }
    }
  }
}

P.S. - если хочешь, чтобы тесты запускались в определённом порядке - то надо помнить, что они запускаются тупо в алфавитном порядке. То есть надо именовать тесты test1Name, test2Name и т.д.

comment comments