gpt4 book ai didi

ios - 在 RxSwift 中测试 BehaviorSubject/Relay

转载 作者:行者123 更新时间:2023-11-30 10:55:17 24 4
gpt4 key购买 nike

我在测试BehaviorRelay 时遇到问题。以下最小代码将可观察量绑定(bind)到BehaviorRelay,但在测试时,测试不会结束并被挂起 - 可观察量不断发出事件,因为它以 Observable.timer 开头。当摆脱 bindRx 方法并仅测试可观察值时,它可以正常工作。但我想正确测试该类 - 这有意义吗?

我该如何去做这项工作?

import XCTest
import RxSwift
import RxCocoa

struct TestObject: Codable {
var a: Int?
var b: Int?

private enum CodingKeys: String, CodingKey {
case a = "test"
case b
}
}

extension TestObject: Equatable {
static func == (lhs: TestObject, rhs: TestObject) -> Bool {
return lhs.a == rhs.a && lhs.b == rhs.b
}
}

class TestObjectFetcher {
private let scheduler: SchedulerType
private let disposeBag = DisposeBag()
let testObject = BehaviorRelay<TestObject?>(value: nil)
var syncInterval = 30.0

init(scheduler: SchedulerType) {
self.scheduler = scheduler
self.bindRx()
}

var fetchTestObjectObservable: Observable<TestObject?> {
return Observable<Int>.timer(0, period: self.syncInterval, scheduler: self.scheduler)
.map { _ -> TestObject? in
TestObject(a: 1, b: 2)
}
}

private func bindRx() {
self.fetchTestObjectObservable
.bind(to: self.testObject)
.disposed(by: self.disposeBag)
}
}

class TestObjectFetcherTests: XCTestCase {
let testScheduler = TestScheduler(initialClock: 0)
func testTestObjectFetcher() {

let testObjectFetcher = TestObjectFetcher(scheduler: testScheduler)

let events: [Recorded<Event<TestObject?>>] = [
Recorded.next(1, TestObject(a: 1, b: 2)),
Recorded.next(31, TestObject(a: 1, b: 2)),
Recorded.next(61, TestObject(a: 1, b: 2))
]

let res = testScheduler.start(created: 0, subscribed: 0, disposed: 90) { () -> Observable<TestObject?> in
return testObjectFetcher.testObject.asObservable()
}

XCTAssertEqual(res.events, events)
}
}

最佳答案

问题是可观察对象从未完成。添加 scheduler.subscribeAt(100) {}并将 fetcher 设置为 nil 解决了问题。

关于ios - 在 RxSwift 中测试 BehaviorSubject/Relay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037818/

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