RxTestでVoidのEventをテストする


RxTestのObserverを使ってVoidイベントの発火をテストするために以下のようなことをするとコンパイルに通りません。

// ViewModel.swift
struct ViewModel {
  let somethingOccurred: Signal<Void>
  ...
}

// ViewModel_Test.swift
let observer = testScheduler.createObserver(Void.self)
vm.somethingOccurred
  .emit(to: observer)
  .disposed(by: disposeBag)

expect(observer.events).to(equal([.next(100, ())])) // Compile Error!! Expression type Protocol type 'Any' cannot conform to 'Equatable' because only concrete types can conform to protocols

原因

なぜこうなるかというと、VoidがEquatableではないからです。

Voidはなにかというと空のtupleです。


public typealias Void = ()

tupleはEquatableではないのでVoidもそうなります。

対策


expect(observer.events).to(haveCount(1))
expect(observer.events[0].time).to(equal(100))

参考