Unit testing 在RxSwift中测试ViewModel
我想在我的一个ViewModel中执行一个测试,该ViewModel包含一个名为“nearByCity”的BehaviorRelay对象,它绑定到名为“IsNearest”的BehaviorRelay。这就是我的视图模型的样子Unit testing 在RxSwift中测试ViewModel,unit-testing,rx-swift,rxtest,Unit Testing,Rx Swift,Rxtest,我想在我的一个ViewModel中执行一个测试,该ViewModel包含一个名为“nearByCity”的BehaviorRelay对象,它绑定到名为“IsNearest”的BehaviorRelay。这就是我的视图模型的样子 class SearchViewViewModel: NSObject { //MARK:- Properties //MARK: Constants let disposeBag = DisposeBag() //MARK: Var
class SearchViewViewModel: NSObject {
//MARK:- Properties
//MARK: Constants
let disposeBag = DisposeBag()
//MARK: Vars
var nearByCity:BehaviorRelay<String?> = BehaviorRelay(value: nil)
var isNearBy = BehaviorRelay(value: true)
//MARK:- Constructor
init() {
super.init()
setupBinders()
}
}
//MARK:- Private methods
private extension SearchViewViewModel{
func setupBinders(){
nearByCity
.asObservable()
.distinctUntilChanged()
.map({$0 ?? ""})
.map({$0 == ""})
.bind(to: isNearBy)
.disposed(by: disposeBag)
}
}
类SearchViewModel:NSObject{
//标记:-属性
//标记:常数
设disposeBag=disposeBag()
//马克:Vars
var nearByCity:BehaviorRelay=BehaviorRelay(值:nil)
var isnearest=BehaviorRelay(值:true)
//马克:-建造师
init(){
super.init()
设置活页夹()
}
}
//MARK:-私有方法
私有扩展SearchViewModel{
func setupBinders(){
附近城市
.asObservable()
.distinctUntilChanged()
.map({$0??“})
.map({$0==“”})
.bind(到:isnearly)
.处置(由:处置人)
}
}
我要执行的测试是实际验证当接受字符串时,bool值是否也会根据函数setupBinders()进行更改
有什么想法吗
谢谢这里有一种测试方法:
class RxSandboxTests: XCTestCase {
func testBinders() {
let scheduler = TestScheduler(initialClock: 0)
let source = scheduler.createColdObservable([.next(5, "hello"), .completed(10)])
let sink = scheduler.createObserver(Bool.self)
let disposeBag = DisposeBag()
let viewModel = SearchViewViewModel(appLocationManager: StubManager())
source.bind(to: viewModel.nearByCity).disposed(by: disposeBag)
viewModel.isNearBy.bind(to: sink).disposed(by: disposeBag)
scheduler.start()
XCTAssertEqual(sink.events, [.next(0, true), .next(5, false)])
}
}
其他几点:
- 不要让您的主题属性
使用var
,因为您不希望任何人能够用未绑定的版本替换它们let
- 在这段代码中必须使用不需要的
,这意味着对象做的太多了。在一个视图控制器中有多个视图模型,每个视图模型处理视图的不同部分,这没有什么错AppLocationManager
- 最好避免在视图模型代码中使用主题(中继),如果需要,最好将它们保留在代码的命令端
func isNearBy(city: Observable<String?>) -> Observable<Bool> {
return city
.distinctUntilChanged()
.map {$0 ?? ""}
.map {$0 == ""}
}
func在附近(城市:可观察)->可观察{
返回城市
.distinctUntilChanged()
.map{$0??“}
.map{$0==“”}
}
RxTest和rxblock用于测试。阅读一些关于它们的文章非常感谢你提供的信息和提示!是的,我将编辑这个问题,因为我确实从一个更大的类中提取了代码。