Avatar
🍤ACエビフライ🔌 10/31/2018 9:21 AM
わかりづらくてすみません 既存のclassやstructのスタブ版を作りたい場合もありますし、 そもそも実装がまだなくてインターフェースだけprotocolで決めてあるときとかもです。 たとえば class Dog : Animal がまだなくて、 protocol Animal はすでに↓みたいなのがあって protocol Animal { func group(id: Int) -> Observable<Group> func bark() -> String } まずはAnimalを使ったモジュールのテストを書いていこうというとき、現状では↓のような汎用のスタブを作り struct StubAnimal { func group(id: Int) -> Observable<Group> { return _group(id) } private var group: ( id: Int) -> Observable<Group> func bark() -> String { return _bark() } private var _bark: () -> String init( group: @escaping ((_ id: Int) -> Observable<Group>) = { _ in Observable.never() } , bark: @escaping (() -> String) = { _ in "meow" } ) { _group = group _bark = bark } } SUTに関係ない関数はデフォルト引数で済ませられるよう、また、何に関心を持っているか、何がSUTへの間接入力になりうるかが明確になるようにしています。 (edited)