Я пытаюсь реализовать сетевой вызов с помощью PromiseKit, и если он не работает, я хочу повторить попытку несколько раз, прежде чем сдаться.Я сделал это, используя документацию PromiseKit , и она, кажется, работает достаточно хорошо.Тем не менее, я столкнулся с проблемой при попытке проверить мою реализацию.
Вот как выглядит мой тест:
func testFetch_withFirstAttemptFailed_shouldFetchEndpointFromDataProviderAgain() {
// Given
let expectation = self.expectation(description: "")
let failingAttempt = Promise<String>.pending()
let succeedingAttempt = Promise<String>.pending()
dataProviderMock.fetchReturnValues = [failingAttempt, succeedingAttempt]
let _: Promise<String> = sut.fetch(EndpointMock())
XCTAssertEqual(dataProviderMock.fetchInvokeCount, 1)
// When
failingAttempt.resolver.reject(MockError.error)
failingAttempt.promise.catch { (_) in
self.wait(for: 3)
succeedingAttempt.resolver.fulfill("success")
}
_ = succeedingAttempt.promise.done { [weak self] result in
// Then
XCTAssertEqual(result, "success")
guard let dataProvider = self?.dataProviderMock else { XCTFail(); return }
XCTAssertEqual(dataProvider.fetchInvokeCount, 2)
expectation.fulfill()
}
self.wait(for: [expectation], timeout: 4)
}
Я издевался над моим поставщиком данных, чтобы он возвращал разные обещания в зависимости от того, какая попыткаэто в настоящее время пытается.Я хочу проверить, что fetch
вызывается во второй раз, если первая попытка не удалась.
В частности, я недоволен частью теста wait
, но так как я нуб, я незнать, когда выполнить последующую попытку.По умолчанию моя SUT имеет задержку повторения в две секунды, но я могу добавить другую в моем тесте, если захочу.В идеале я вообще не хочу ждать, поэтому, если кто-то знает, в каком закрытии я могу выполнить следующую попытку, пожалуйста, дайте мне знать.
Я пытался использовать ту же функцию recover
, которая использовалась в реализации повторано, похоже, что при его выполнении выполняется тело до вызова fetch, поэтому мое утверждение не выполняется.