模拟 Reactive<UISlider>?

Mock a Reactive<UISlider>?

我有一个 ViewModel,它在其初始化程序中有一个输入

init(sliderEvents: Reactive<UISlider>) {

在测试中我想做类似

的事情
slider.send(.touchDownInside)
slider.send(.valueChanged, 5)
slider.send(.valueChanged, 15)

例如,为了模拟滑块从值 5 拖动到 15 的 VM

我不清楚 RAC 是如何构建 Base: UISlider 的,所以我对如何创建 UISlider 的子类来使这种模拟成为可能感到困惑

您可以将 ViewModel 设置为具有 Double 类型的 ObserverActionMutableProperty(任何接受输入的内容)。然后将 UISlider 值绑定到 ViewController.

中的值

所以在你的 ViewController 中你可以有这样一行: viewModel.sliderValue <~ slider.reactive.mapControlEvents(.valueChanged){ [=15=].value } 其中 sliderValue 可以是类型 MutableProperty<Double>.

在您的测试中,您可以这样设置值:viewModelToTest.sliderValue.value = 10

这是另一种应该有效的方法:

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.

一样简单