i具有一个视图模型,该视图是其初始器中的输入
init(sliderEvents: Reactive<UISlider>) {
在测试中,我想做
之类的事情slider.send(.touchDownInside)
slider.send(.valueChanged, 5)
slider.send(.valueChanged, 15)
为VM模拟滑块从值5到15拖动
我尚不清楚RAC是如何建立基础的:Uislider,所以我对如何使Uislider的子类使这种模仿成为可能
您可以将ViewModel设置为具有Observer
,Action
或MutableProperty
(任何内容输入(,带有Double
类型。然后将UISlider
值绑在您的ViewController中。
因此,在您的ViewController中,您可以拥有这样的行: viewModel.sliderValue <~ slider.reactive.mapControlEvents(.valueChanged){ $0.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
一样简单。