【问题标题】:How do you test if an observable is retried X times when failing?你如何测试一个 observable 在失败时是否重试 X 次?
【发布时间】:2020-06-05 02:39:17
【问题描述】:

我有一个 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】:

    首先,要了解 Observable 只会发出 single 错误事件。没有办法让您的测试按现状通过。

    但是,尽管我不确定为什么在检查它是否进行了 11 次尝试时将函数命名为 10Times,但以下内容将通过。

    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 ""
        }
    }
    

    【讨论】:

    • 对了。平面图中的那个是会被多次调用的那个,而不是setCreated() observable。我的错。关于为什么我用值 11 断言它,我认为这是 1 次初始错误 + 10 次重试。
    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2019-03-07
    • 2012-08-14
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多