gpt4 book ai didi

mvvm - 使用RxSwift测试ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:44:19 25 4
gpt4 key购买 nike

我在当前正在工作的项目中使用ModelView-ViewModel,并使用RxSwiftRxBlockingRxTests。目前,我正在尝试测试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

谢谢

最佳答案

由于同事的建议,我找到了一种更好的方法来构造ExampleViewModel以实现可测试性。通过使用ExampleViewModel分离验证方法,并通过使用使用验证器的textFieldColor运算符设置Observable map,验证是在外部完成的,并且不使用Rx简化了逻辑测试。

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()
}
}
}

关于mvvm - 使用RxSwift测试ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com