ios - 在 RxSwift 中测试 BehaviorSubject/Relay

标签 ios swift rx-swift rxtest

我在测试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/

相关文章:

IOS - Objective-C - 如何在选择 pickerView 元素时以编程方式删除 UItextfield?

ios - 如何使用 RxAlamofire 在帖子正文中传递 json 进行帖子调用

swift - 如何将 RxDataSource 与 SearchBar 一起使用?

android - 我应该用什么来制作角色动画?

c# - 从 iPhone native 应用程序使用 Xamarin 库

ios - Swift 通用闭包总和

swift - 在 Swift 中,如何在不实际调用该方法的情况下测试对象是否实现了签名不同的可选协议(protocol)方法?

ios - iOS中是否可以直接解析API protobuf文件?

swift - RxSwift 正确使用变量

objective-c - UIPickerView 在 ActionSheet 上的奇怪行为