Вопрос проверяет умение синхронизировать ожидание результатов внутри XCTest и обрабатывать колбэки или async/await.
В XCTest используют XCTestExpectation, вызывая expectation(description:) и wait(for:timeout:) или пишут async-тест с async/await, где просто await нужной функции. Для сетевых запросов применяют моки URLProtocol или URLSession с URLSessionConfiguration.ephemeral и protocolClasses, чтобы возвращать фиктивные данные.
С XCTestExpectation:
func testFetch() {
let exp = expectation(description: "Fetch data")
network.fetchData { result in
XCTAssertNotNil(result)
exp.fulfill()
}
wait(for: [exp], timeout: 2)
}С async/await в XCTest:
func testFetchAsync() async throws {
let data = try await network.fetchData()
XCTAssertEqual(data.count, expectedCount)
}Mock URLSession:
Реализовать свой URLProtocol, перехватывающий запросы и возвращающий заранее заданный ответ.
Подставить его в URLSessionConfiguration.
Избегание реальных сетей:
Безопаснее и быстрее использовать фейковые ответы, чтобы тесты не падали при отсутствии сети.
Вывод:
Ожидания в XCTest и мок-сессии позволяют надёжно тестировать асинхронный код с контролируемыми сценариями без зависимости от внешних сервисов.