Как проверить попытки повторных попыток в 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, поэтому мое утверждение не выполняется.

0 ответов

Другие вопросы по тегам