Код: Выделить всё
protocol MyInteractorProtocol {
func viewDidLoad()
}
class MyInteractor: MyInteractorProtocol {
private var presenter: MyPresenterProtocol
init(presenter: MyPresenterProtocol) {
self.presenter = presenter
}
func viewDidLoad() {
Task {
await fetchData()
}
}
private func fetchData() async {
// Some data fetching here
await updateUI()
}
@MainActor
private func updateUI() {
presenter.presentData()
}
}
< /code>
и мой текущий тест: < /pbr />
import XCTest
final class MyInteractorTests: XCTestCase {
func testViewDidLoadCallsPresenterUsingSleep() async throws {
let mockPresenter = MockPresenter()
let interactor = MyInteractor(presenter: mockPresenter)
interactor.viewDidLoad()
// I'm currently using sleep to wait for the async task to finish
try await Task.sleep(nanoseconds: 1_000_000_000) // 1 second
XCTAssertTrue(mockPresenter.presentDataCalled)
}
func testViewDidLoadCallsPresenterUsingExpectation() {
let mockPresenter = MockPresenter()
let interactor = MyInteractor(presenter: mockPresenter)
let expectation = expectation(description: "Presenter should call presentData")
Task {
interactor.viewDidLoad()
expectation.fulfill()
}
wait(for: [expectation])
XCTAssertTrue(mockPresenter.presentDataCalled)
}
}
Вопрос: Каков правильный способ проверить асинхронные задачи в Swift xctest, не полагаясь на задачу. Sleep () или произвольные забои? В идеале я хочу, чтобы тест ждал задачи, прежде чем выполнить утверждения, но без жестких продолжительности сна или взлома, чтобы заставить ее работать. Есть предложения для лучшей схемы тестирования в этом случае?
Подробнее здесь: https://stackoverflow.com/questions/789 ... -in-xctest