gpt4 book ai didi

swift - RxTest - 如何比较 Event 因为 Void 不是 Equatable

转载 作者:行者123 更新时间:2023-12-05 02:58:00 25 4
gpt4 key购买 nike

ViewModel 有一个绑定(bind)到 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)

我收到以下错误:

Expression type '()' is ambiguous without more context

在 Rx 中,Void事件是正常的,为了正确测试 ViewModel,需要比较它们。例如.next(0, ()) , .completed(0)Void不是 Equatable让它变得没有意义Equatable .但是,我需要断言事件是否为 .next.error.completed .我如何断言该部分?

最佳答案

使用 Void 有时会很痛苦。

尝试了您的示例,但是为 Result 或包含 VoidEvent 添加了一些符合 Equatable 的条件> 是不可能的,因为 Void 不是标称类型,或者因为这些类型已经与 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")
}

现在这太丑陋了,而且难以阅读。另一种方法是引入包装器:

struct VoidRecord: Equatable {
let record: Recorded<Event<Void>>

static func == (lhs: Self, rhs: Self) -> Bool {
guard lhs.record.time == rhs.record.time else { return false }

switch (lhs.record.value, rhs.record.value) {
case (.next, .next),
(.completed, .completed):
return true
default:
return false
}
}
}

XCTAssertEqual(
voidEventsObserver.events.map(VoidRecord.init),
correctValues.map(VoidRecord.init)
)

这样读起来好多了。请注意,上面将 .error 事件视为始终不同。如果您需要比较错误事件,只需添加 this logic从 RxSwift 到上面的 == 函数。

关于swift - RxTest - 如何比较 Event<Void> 因为 Void 不是 Equatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59467791/

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