Пока писал тесты в приложении, столкнулся с тем, что не работают тесты, в которых есть асинхронный код. Например, если мы делаем асинхронный запрос в сеть и 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 и т.д.