Макет реактивной <UISlider>? - PullRequest
       30

Макет реактивной <UISlider>?

0 голосов
/ 25 апреля 2018

У меня есть ViewModel, которая имеет в качестве входных данных в своем инициализаторе

init(sliderEvents: Reactive<UISlider>) {

В тесте я хочу сделать что-то вроде

slider.send(.touchDownInside)
slider.send(.valueChanged, 5)
slider.send(.valueChanged, 15)

Чтобы смоделировать для виртуальной машины, что ползунок был перемещен от значения 5 до 15, например,

Мне неясно, как RAC создал Base: UISlider, поэтому я запутался в том, как сделать подкласс UISlider, чтобы сделать этот вид насмешек возможным

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вот еще один подход, который должен работать:

protocol SliderProtocol {
    var valuesSignal: Signal<Float, NoError> { get }
}

extension UISlider: SliderProtocol {
    var valuesSignal: Signal<Float, NoError> {
        return reactive.values
    }
}

extension Reactive where Base: SliderProtocol {
    var values: Signal<Float, NoError> {
        return base.valuesSignal
    }
}

class MockSlider: SliderProtocol {
    let mockValue = MutableProperty<Float>(0)

    var valuesSignal: Signal<Float, NoError> {
        return mockValue.signal
    }
}

Ваша ViewModel должна начать с Reactive<SliderProtocol>, и вы можете передать ему экземпляр MockSlider. Насмешка будет так же проста, как установка mockSlider.mockValue.value = 10.

0 голосов
/ 25 апреля 2018

Вы можете настроить ViewModel на Observer, Action или MutableProperty (все, что требует ввода) с типом Double. Затем привяжите значения UISlider к значениям в вашем ViewController.

Таким образом, в вашем ViewController вы могли бы иметь следующую строку: viewModel.sliderValue <~ slider.reactive.mapControlEvents(.valueChanged){ $0.value }, где sliderValue может иметь тип MutableProperty<Double>.

В своих тестах вы можете установить значения следующим образом: viewModelToTest.sliderValue.value = 10

...