Как проверить попытки повторных попыток в PromiseKit? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь реализовать сетевой вызов с помощью 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, поэтому мое утверждение не выполняется.

...