3

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

init(sliderEvents: Reactive<UISlider>) {

在测试中我想做类似的事情

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

例如,模拟将滑块从值 5 拖到 15 的 VM

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

4

2 回答 2

3

您可以将 ViewModel 设置为具有Observer,ActionMutableProperty(任何内容都需要输入)Double类型。然后将UISlider值绑定到 ViewController 中的值。

所以在你的 ViewController 中你可以有这样的一行:viewModel.sliderValue <~ slider.reactive.mapControlEvents(.valueChanged){ $0.value }where sliderValuecould be of type MutableProperty<Double>

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

于 2018-04-25T14:52:56.120 回答
2

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

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 应该使用 initReactive<SliderProtocol>并且您可以将MockSlider实例传递给它。模拟就像设置一样简单mockSlider.mockValue.value = 10

于 2018-04-26T09:57:28.910 回答