Как я могу проверить метод взаимодействия с асинхронными задачами в Swift в Xctest?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу проверить метод взаимодействия с асинхронными задачами в Swift в Xctest?

Сообщение Anonymous »

Я работаю над приложением в Swift, используя архитектуру VIP (чистый Swift). У меня есть интерактор, который имеет метод, запускаемый с помощью ViewController (также называемый ViewDidload для удобства), он начинает асинхронную задачу для извлечения данных, а затем обновляет пользовательский интерфейс. Обновление пользовательского интерфейса выполняется через докладчика (который вводится в взаимодействующий). Я использую фиктивного докладчика и проверяю, называются ли ожидаемые методы. Тем не менее, методы, вызывающие докладчика, должны быть ожидаются, потому что они работают с использованием @mainactor , и я не уверен, как их ждать в моих тестах.

Код: Выделить всё

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)
}
}
Первый тест использует task.sleep () , чтобы дождаться завершения асинхронных операций, но я хотел бы избежать этого подхода. Во втором тесте я использовал xcteStextation, но оно кажется взломанным (и, кажется, приводит к неумолимым тестам). < /P>
Вопрос: Каков правильный способ проверить асинхронные задачи в Swift xctest, не полагаясь на задачу. Sleep () или произвольные забои? В идеале я хочу, чтобы тест ждал задачи, прежде чем выполнить утверждения, но без жестких продолжительности сна или взлома, чтобы заставить ее работать. Есть предложения для лучшей схемы тестирования в этом случае?


Подробнее здесь: https://stackoverflow.com/questions/789 ... -in-xctest
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»