Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在RxSwift中测试ViewModel_Unit Testing_Rx Swift_Rxtest - Fatal编程技术网

Unit testing 在RxSwift中测试ViewModel

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

我想在我的一个ViewModel中执行一个测试,该ViewModel包含一个名为“nearByCity”的BehaviorRelay对象,它绑定到名为“IsNearest”的BehaviorRelay。这就是我的视图模型的样子

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
    ,这意味着对象做的太多了。在一个视图控制器中有多个视图模型,每个视图模型处理视图的不同部分,这没有什么错

  • 最好避免在视图模型代码中使用主题(中继),如果需要,最好将它们保留在代码的命令端

至少,分解setupBinders功能,以便部件可以独立测试。您的上述内容可以写成一个简单、易于测试的免费函数:

func isNearBy(city: Observable<String?>) -> Observable<Bool> {
    return city
        .distinctUntilChanged()
        .map {$0 ?? ""}
        .map {$0 == ""}
}
func在附近(城市:可观察)->可观察{
返回城市
.distinctUntilChanged()
.map{$0??“}
.map{$0==“”}
}

RxTest和rxblock用于测试。阅读一些关于它们的文章非常感谢你提供的信息和提示!是的,我将编辑这个问题,因为我确实从一个更大的类中提取了代码。