Как проверить попытки повторных попыток в PromiseKit?
Я пытаюсь реализовать сетевой вызов с помощью 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
функция, используемая в реализации retry, но кажется, что при ее выполнении тело выполняется до вызова fetch, поэтому мое утверждение не выполняется.