gpt4 book ai didi

swift - RxSwift : how to Unit Test Searching in Searchbar and displaying results in tableview

转载 作者:行者123 更新时间:2023-12-03 12:59:40 24 4
gpt4 key购买 nike

所以我一直在使用 Rxswift 并且它运行良好。我已经设法让我的所有代码都在测试中,但我正在努力弄清楚如何使用 searchbar.rx.bindTo 测试搜索。

有很多关于如何使用 RxSwift 在 tableview 上搜索和返回结果的教程,但在这些教程中都没有向您展示如何对其进行单元测试。
https://www.thedroidsonroids.com/blog/ios/rxswift-by-examples-1-the-basics/

上面的链接显示了我试图通过搜索栏和填充 TableView 实现的目标。

我试过用 RxBlocking 测试它,但我的测试似乎都挂了。
systemUnderTest 是 View 模型
结果是从服务返回的 Observable<[T]>。

let results = systemUnderTest.results.toBlocking()
let noneObservableList = try! results.single()

//Then
XCTAssert(noneObservableList?.count == expectedCount)

它卡在尝试! results.single() 并且从不命中断言。任何人都知道如何测试这个。

提前致谢。

这是 systemUnderTest:
public class SearchViewModel: SearchViewModelContract {

public var query: Variable<String?> = Variable(String.EmptyString())
public var results: Observable<[ThirdPartySite]>
let minimumCharacterCount = 4
let dueTime = 0.3
let disposeBag = DisposeBag()

public init() {
results = Observable.just([Object]())
results = query.asObservable().throttle(dueTime, scheduler: MainScheduler.instance).flatMapLatest{
queryString -> Observable<Object> in

if let queryString = queryString {
if queryString.characters.count >= self.minimumCharacterCount {
return self.Something(siteName: queryString)
}
return Observable.just(Object(in: Object()))
}
return Observable.just(Object(in: Object()))
}.map { results in
return results.items
}.catchErrorJustReturn([Object]()).shareReplay(1)
}
}

最佳答案

我有一些建议:

  • queryresults两者都应该是 let ,而不是 vars 。你永远不应该重置 Observable 类型。这是功能性意义的一部分。
  • 你似乎在使用旧版本的 RxSwift;建议你升级。 - 编辑:DOH!当然是老版本的 RxSwift,这是个老问题!
  • 嵌入了副作用(网络调用)的单元测试代码可能是一个巨大的 PITA。将副作用提升到更高级别,这样您就可以在没有它的情况下对其进行单元测试。
  • debounce运算符比 throttle 更适合用于数据排放。后者更适合触发器。

  • 至于你关于如何对搜索进行单元测试的主要问题,我发现 RxTest 取得了很多成功。 .以下是生成 searchTerm Observable 的代码以及证明其有效的测试:
    extension ObservableType where Element == String? {

    func searchTerm(minCharacterCount: Int = 4, dueTime: RxTimeInterval = .milliseconds(300), scheduler: SchedulerType = MainScheduler.instance) -> Observable<String> {
    return self
    .compactMap { $0 }
    .filter { minCharacterCount <= $0.count }
    .debounce(dueTime, scheduler: scheduler)
    }
    }

    class Tests: XCTestCase {

    var scheduler: TestScheduler!
    var result: TestableObserver<String>!
    var disposeBag: DisposeBag!

    override func setUp() {
    super.setUp()
    scheduler = TestScheduler(initialClock: 0, resolution: 0.001)
    result = scheduler.createObserver(String.self)
    disposeBag = DisposeBag()
    }

    func testExample() {
    let input = scheduler.createColdObservable([
    .next(1000, Optional.some("")),
    .next(2000, Optional.some("xyz")),
    .next(3000, Optional.some("wxyz")),
    .next(4000, Optional.some("vwxyz")),
    .next(4300, Optional.some("uvwxyz"))
    ])

    input
    .searchTerm(scheduler: scheduler)
    .subscribe(result)
    .disposed(by: disposeBag)

    scheduler.start()

    XCTAssertEqual(result.events, [.next(3300, "wxyz"), .next(4600, "uvwxyz")])
    }
    }
    flatMapLatest应该放在你的副作用代码中,你没有单元测试的东西。

    关于swift - RxSwift : how to Unit Test Searching in Searchbar and displaying results in tableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44820437/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com