我有一个observable,如果失败了,我需要重试几次。而我目前正在尝试对它进行单元测试。到目前为止,我已经这样做了,它失败了,总是返回1而不是11次。
func testSetCreated_ShouldRetry10Times_BeforeStopping() throws {
let setCreatedProvider: (String, String) -> Single<ResponseData> = { (_, _) in
return .error(RxCocoaURLError.unknown)
}
let statusHandler = createConsultationHandler(setCreatedProvider: setCreatedProvider)
var setCreatedEmitCount = 0
statusHandler.setCreated(consultationId: .random(length: 24))
.subscribe(onError: { _ in
setCreatedEmitCount += 1
})
.disposed(by: disposeBag)
sleep(10)
XCTAssertEqual(11, setCreatedEmitCount)
}
那么,我怎样才能准确地测试这个函数在失败的情况下会被调用11次?谢谢。
首先,理解一个Observable只会发出一个 单一 错误事件。目前没有办法让你的测试通过。
然而,下面的内容会通过,尽管我不知道为什么你把这个函数命名为 10Times
当你在检查它是否进行了11次尝试时。
class rx_sandboxTests: XCTestCase {
var disposeBag = DisposeBag()
func testSetCreated_ShouldRetry10Times_BeforeStopping() throws {
var setCreatedEmitCount = 0
let setCreatedProvider: (String, String) -> Single<ResponseData> = { (_, _) in
setCreatedEmitCount += 1
return .error(RxCocoaURLError.unknown)
}
let statusHandler = createConsultationHandler(setCreatedProvider: setCreatedProvider)
statusHandler.setCreated(consultationId: .random(length: 24))
.subscribe()
.disposed(by: disposeBag)
XCTAssertEqual(11, setCreatedEmitCount)
}
}
func createConsultationHandler(setCreatedProvider: @escaping (String, String) -> Single<ResponseData>) -> ConsultationHandler {
return ConsultationHandler(setCreatedProvider: setCreatedProvider)
}
struct ConsultationHandler {
private let createdProvider: (String, String) -> Single<ResponseData>
init(setCreatedProvider: @escaping (String, String) -> Single<ResponseData>) {
self.createdProvider = setCreatedProvider
}
func setCreated(consultationId: String) -> Observable<ResponseData> {
return Observable.just(())
.flatMap { [createdProvider] in createdProvider("hello", "world") }
.retry(11)
}
}
struct ResponseData { }
enum RxCocoaURLError: Error { case unknown }
extension String {
static func random(length: Int) -> String {
return ""
}
}