2016-01-06 2 views
2

Я использую ModelView-ViewModel в проекте я работаю и с помощью RxSwift, RxBlocking & RxTests. В настоящее время я пытаюсь проверить ViewModel, но у меня много проблем, чтобы обдумать это.тестирование ViewModel с RxSwift

Так скажем, у меня есть ExampleViewModel для моего ExampleViewController. Мой ExampleViewModel ожидает поток Observable, который представляет собой комбинацию (combineLatest) двух потоков от UITextField, причем одно из них, если textField либо сфокусировано, а другое - поток текста; так что-то вроде Observable<(Bool, String)>. В зависимости от того, сфокусирован ли и контекст строки, мой ExampleViewModel будет излучать событие в его внутренне открытое свойство, которое является Observable состоянием фона backgroundColor UITextField; 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

Благодаря предложению моего коллеги, я нашел лучший способ по структурированию ExampleViewModel для контролируемости. Разделив метод проверки с помощью ExampleViewModel и установив textFieldColorObservable с помощью оператора 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() 
    } 
} 
} 
Смежные вопросы