我在我目前正在使用的项目中使用ModelView-ViewModel
并使用RxSwift
,RxBlocking
& RxTests
。目前我正在尝试测试ViewModel但遇到很多麻烦让我解决这个问题。
所以我可以说ExampleViewModel
有一个ExampleViewController
。我的ExampleViewModel
期待一个Observable
流,它是来自combineLatest
的两个流的组合(UITextField
),一个是如果textField是聚焦而另一个是流文本;像Observable<(Bool, String)>
这样的东西。根据是否为焦点和字符串的上下文,我的ExampleViewModel
将向其内部公开的属性发出一个事件,该Observable
状态为UITextField
的backgroundColor; Observable<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
。
由于
答案 0 :(得分:0)
感谢我的同事的建议,我找到了一种更好的方法来构建ExampleViewModel
的可测试性。通过使用ExampleViewModel
分离验证方法并使用使用验证程序的textFieldColor
运算符设置Observable
map
,验证在外部完成,不使用{ {1}}简化逻辑测试。
ExampleViewModel
Rx