RXSwift — 使用RxTest 和RxBlocking对R

2019-06-19  本文已影响0人  沈枫_ShenF
12

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

RxTest

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

Schedulers

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

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

常用单例:

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

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

上一篇 下一篇

猜你喜欢

热点阅读