LoginSignup
5
5

More than 5 years have passed since last update.

RxBlockingを使ってObservableのテストを書く

Last updated at Posted at 2017-07-10

Observableはテストしにくい?

既存のプログラムをいっぱいObservableに書き換えると、テストが死にます。当たり前ですね。

非同期のものをテストしなきゃいけなくなるわけですが、ちょっとわかりにくいです。
そこで、RxBlockingで同期処理に変換してからテストすると、従来コードからの書き換えも少なくて楽です。
ちょっと書く量が多いだけで、通常のテストと同様にかけます

RxBlocking

Observableをblockして同期処理に変換できます。
実コードには書きたくないですが、テストには楽で良いです。

operator

operatorは4つあります
https://github.com/ReactiveX/RxSwift/blob/master/RxBlocking/BlockingObservable%2BOperators.swift

first()

take(1) をテストする時、すなわち最初にonNextで流れてきた要素をテストする時

let o: Observable<Hoge>
let result: Hoge = try! o.toBlocking().first()!
assertEqual(result, expection)

last()

takeLast(1) をテストする時、すなわちonCompletedが流れてくるまで待ってから、最後にonNextで流れてきた要素をテストする時

let o: Observable<Hoge>
let result: Hoge = try! o.toBlocking().last()!
assertEqual(result, expection)

toArray()

onNextで流れてくる要素をcompletedするまですべて読み込み、配列にします。

let o: Observable<Hoge>
let result: Hoge = try! o.toBlocking().toArray()
assertEqual(result, expection)

single(predicate:_)

single() はonNextで流れてくる要素のうち、predicateを満たすものがただ一つな上でcompletedすることを検証します。

predicateを渡さないときはすべての要素に対してtrueになるので、要素がただ一つであることを検証します。

あくまでcurrentThreadのみブロックする

subscribeOnやobserveOnなどを使うとうまくいかないそうなので注意

5
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5