ViewModel具有一个输入(观察者),该输入绑定到tap
中UIButton
的UIViewController
事件。该观察者的类型为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
。我如何断言那一部分?
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") }
函数中。