我有一个ViewModel,它在它的初始化器中作为输入
init(sliderEvents: Reactive<UISlider>) {
在考试中,我想做这样的事情
slider.send(.touchDownInside)
slider.send(.valueChanged, 5)
slider.send(.valueChanged, 15)
为了模拟VM,滑块从值5拖动到15,例如
我不清楚RAC是如何构建Base: UISlider的,所以我不知道如何使UISlider的子类成为可能
发布于 2018-04-26 09:57:28
下面是另一种应该有效的方法:
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
一样简单。
发布于 2018-04-25 14:52:56
您可以将ViewModel设置为具有Observer
、Action
或MutableProperty
(任何需要输入的东西)的Double
类型。然后将UISlider
值绑定到ViewController中的值。
所以在您的ViewController中,您可以有这样的一行:viewModel.sliderValue <~ slider.reactive.mapControlEvents(.valueChanged){ $0.value }
,其中sliderValue
可以是MutableProperty<Double>
类型。
在测试中,您可以设置如下所示的值:viewModelToTest.sliderValue.value = 10
https://stackoverflow.com/questions/50024126
复制相似问题