1

ModelView-ViewModelは現在作業しているプロジェクトで使用しておりRxSwiftRxBlocking&を使用していRxTestsます。現在、私は ViewModel をテストしようとしていますが、これを回避するには多くの問題があります。

だから私は私の を持っているとExampleViewModelしましょうExampleViewController。Myは、 からの 2 つのストリームの組み合わせ ( ) でExampleViewModelあるストリームを期待しています。のようなものです。フォーカスされているかどうか、および文字列のコンテキストに応じて、myは内部的に公開されたプロパティにイベントを発行します。これは、の backgroundColor の状態です。.ObservablecombineLatestUITextFieldObservable<(Bool, String)>ExampleViewModelObservableUITextFieldObservable<UIColor>

ExampleViewModel.swift:

class ExampleViewModel {

private let disposeBag = DisposeBag()

private let _textFieldColor: PublishSubject<UIColor>
var textFieldColor: Observable<UIColor> { get { return self._textFieldColor.asObservable() } }

init(textFieldObservable: Observable<(Bool, String)>) {
    textFieldObservable.subscribeNext { (focus, text) in
        self.validateTextField(focus, text: text)
    }.addDisposableTo(self.disposeBag)
}

func validateTextField(focus: Bool, text: String) {
    if !focus && !text.isEmpty {
        self._textFieldColor.onNext(UIColor.whiteColor())
    } else {
        self._textFieldColor.onNext(UIColor.redColor())
    }
}
}

(正しいフォーマットの仕方がわかりません)

基本的には、クラスをテストし、フォーカスとテキスト入力を制御することExampleViewModelで正しいものを出力することをテストしたいと思います。UIColor

ありがとう

4

1 に答える 1

0

同僚の提案のおかげで、ExampleViewModelテスト容易性のために を構造化するためのより良い方法を見つけました。で検証メソッドを分離し、バリデーターが使用される演算子を使用してExampleViewModelを設定することにより、検証は外部で行われ、ロジックのテストの簡素化は使用されません。textFieldColor ObservablemapRx

ExampleViewModel

class ExampleViewModel {

var textFieldColor: Observable<UIColor>

init(
    textFieldText: Observable<String>,
    textFieldFocus: Observable<Bool>,
    validator: TextFieldValidator
) {
    self. textFieldColor = Observable.combineLatest(textFieldText, textFieldFocus) { ($0, $1) }. map { validator.validate($1, text: $0) }
}
}



 class TextFieldValidator {

func validate(focus: Bool, text: String) -> UIColor {
    if !focus && !text.isEmpty {
        return UIColor.whiteColor()
    } else {
        return UIColor.redColor()
    }
}
}
于 2016-01-07T13:58:45.073 に答える