1

ModelView-ViewModel在我目前正在工作和使用的项目中使用RxSwift, RxBlocking& RxTests。目前我正在尝试测试 ViewModel,但在解决这个问题时遇到了很多麻烦。

所以可以说我有一个ExampleViewModel适合我的ExampleViewController. 我ExampleViewModel期待一个流,它是来自 的两个流Observable的组合 ( ) ,一个是 textField 要么是焦点,另一个是文本流;所以像。根据是否聚焦和字符串的上下文,my将向其内部公开的属性发出一个事件,该属性是backgroundColor的状态;.combineLatestUITextFieldObservable<(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

示例视图模型

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 回答