如何测试一个observable失败时是否重试X次?

问题描述 投票:1回答:1

我有一个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次?谢谢。

swift rx-swift xctest
1个回答
1
投票

首先,理解一个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 ""
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.