RxTest-如何比较事件 ,因为空隙不能相等

问题描述 投票:0回答:1

ViewModel具有一个输入(观察者),该输入绑定到tapUIButtonUIViewController事件。该观察者的类型为AnyObserver<Void>

在我的单元测试中,这是我所期望的:

let correctValues: [Recorded<Event<Void>>] = Recorded.events(
       .next(0, ()),
       .completed(0)
   )

我的测试观察者定义是:

private var voidEventsObserver: TestableObserver<Void>!

let scheduler = TestScheduler(initialClock: 0)
voidEventsObserver = scheduler.createObserver(Void.self)

声明声明:

XCTAssertEqual(voidEventsObserver.events, correctValues)

我遇到以下错误:

表达式类型'()'在没有更多上下文的情况下是模棱两可的

在Rx中,Void事件是正常现象,要正确测试ViewModel,需要对其进行比较。例如.next(0, ()).completed(0)等。Void不是Equatable,将其设为Equatable没有任何意义。但是,我需要断言事件是.next还是.error.completed。我如何断言那一部分?

swift rx-swift rxtest
1个回答
0
投票

Void的使用有时可能会很痛苦。>>

玩弄您的示例,但由于Equatable不是标称类型,或者由于这些类型已经具有与Result冲突的一致性。

一种方法是做这样的事情:

Event

现在这很丑,很难读。另一种方法是引入包装器:

Void

读起来好多了。请注意,以上将Void事件视为总是不同的。如果需要比较错误事件,只需将RxSwift中的Equatable添加到上面的XCTAssertEqual(voidEventsObserver.events.count, correctValues.count) for (actual, expected) in zip(voidEventsObserver.events, correctValues) { XCTAssertEqual(actual.time, expected.time, "different times") let equal: Bool switch (actual.value, expected.value) { case (.next, .next), (.completed, .completed): equal = true default: equal = false } XCTAssertTrue(equal, "different event") } 函数中。

© www.soinside.com 2019 - 2024. All rights reserved.