如何在PromiseKit中测试重试尝试?

时间:2018-12-07 10:38:01

标签: ios swift testing xctest promisekit

我正在尝试使用PromiseKit进行网络调用,如果失败,我希望它在放弃之前重试几次。我已经使用PromiseKit documentation完成了此任务,它似乎运行良好。但是,在尝试测试实现时遇到了问题。

这是我的测试结果:

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重试延迟为2秒,但如果需要,我可以在测试中注入另一个。理想情况下,我根本不想等待,因此,如果有人知道我可以完成哪种闭合操作,请告诉我。

我尝试使用与重试实现中相同的recover函数,但是似乎在调用fetch之前在其中实现该函数会执行主体,因此我的断言失败。

0 个答案:

没有答案