美文网首页
RXSwift — 使用RxTest 和RxBlocking对R

RXSwift — 使用RxTest 和RxBlocking对R

作者: 沈枫_ShenF | 来源:发表于2019-06-19 11:07 被阅读0次
    12

    RxTest和RxBlocking属于RxSwift库,需要单独的导入。
    RxTest可测试Rx代码,它包括TestScheduler。
    RxBlocking可以将一个普通的可观察序列转换为一个可观察的阻塞序列,它将阻塞正在运行的线程,直到可观察序列完成或超时为止,让测试异步操作更加容易。

    RxTest

    RxTest为测试公开了两种可观察性。

    • HotObservables:不管是否有任何订阅者,HotObservables都会使用测试scheduler在指定的时间重播事件。
    • ColdObservables:ColdObservables的工作方式更像普通的可观察对象,在订阅时将其元素重新播放给新订阅者。

    Schedulers

    Schedulers主要用来指定执行队列。
    有如下内置类型:

    • SerialDispatchQueueScheduler:在指定的串行调度队列上调度工作。
    • ConcurrentDispatchQueueScheduler:在并发调度队列上调度工作。
    • OperationQueueScheduler:在指定的NSOperations队列上执行工作。

    我们也可以自定义Schedulers,要遵循ImmediateScheduler协议。

    常用单例:

    • CurrentThreadScheduler:表示当前线程,是默认的调度器。
    • MainScheduler:表示通常用于所有ui相关工作的主线程。

    Testing with RxBlocking

    现在我们进行一个测试。

    # RxTests 和 RxBlocking 将在单元/集成测试中起到重要作用
    target 'YOUR_TESTING_TARGET' do
        pod 'RxBlocking', '~> 5.0'
        pod 'RxTest', '~> 5.0'
    end
    

    第一步,先创建一个10、20和30的可观察序列,如下所示:

    func testBlocking(){
            let observableToTest = Observable.of(10, 20, 30)
    }
    

    第二步,调用toBlocking():

    let result = observableToTest.toBlocking()
    

    toBlocking()将一个常规的可观察序列转变为一个阻塞的可观察序列,如下图所示:

    第三步,封装在do catch语句中,添加AssertEquals语句,如下所示:

    func testBlocking(){
            let observableToTest = Observable.of(10, 20, 30)
            do{
                let result = try observableToTest.toBlocking().first()
                XCTAssertEqual(result, 10)
            } catch {
                XCTFail(error.localizedDescription)
            }
    }
    

    第四步,运行测试,可以看到测试通过。

    当然,我们也可以通过try!:

    func testBlocking(){
            let observableToTest = Observable.of(10, 20, 30)
    //        do{
    //            let result = try observableToTest.toBlocking().first()
    //            XCTAssertEqual(result, 10)
    //        } catch {
    //            XCTFail(error.localizedDescription)
    //        }
            XCTAssertEqual(try! observableToTest.toBlocking().first(), 10)
    }
    

    为了测试异步操作,我们将再编写一个测试。这一次,我们将在后台线程上使用一个并发调度程序,如下:

    func testAsynchronousToArry(){
            let scheduler = ConcurrentDispatchQueueScheduler(qos: .background)
    }
    

    第一步,创建一个包含简单整数的可观察序列,使用map将每个值加倍,如下所示:

    let intObservbale = Observable.of(10, 20, 30)
                .map{ $0 * 2 }
    

    第二步,订阅scheduler:

    let intObservbale = Observable.of(10, 20, 30)
                .map{ $0 * 2 }
                .subscribeOn(scheduler)
    

    第三步,跟上个测试一样,将其封装到do catch语句中,调用toBlocking,如下:

    do{
       let result = try intObservbale.observeOn(MainScheduler.instance).toBlocking().toArray()
        } catch {   
        }
    

    第四步,添加断言:

    do{
       let result = try intObservbale.observeOn(MainScheduler.instance).toBlocking().toArray()
                XCTAssertEqual(result, [20, 40, 60])
         } catch {
                XCTFail(error.localizedDescription)
         }
    

    第五步,运行,测试通过:

    相关文章

      网友评论

          本文标题:RXSwift — 使用RxTest 和RxBlocking对R

          本文链接:https://www.haomeiwen.com/subject/lqxmzqtx.html