我正在尝试使用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之前在其中实现该函数会执行主体,因此我的断言失败。