【问题标题】:Mock and inject ObservableObject模拟和注入 ObservableObject
【发布时间】:2020-03-04 11:36:15
【问题描述】:
我有一个类Foo,它对ObservableObject 有多个依赖项。出于测试目的,我想创建这些对象的模拟版本,但我看不到这样做的方法,然后将它们注入 Foo。
- 我无法创建我的
ObservableObject 实现的另一个协议,因为ObservableObject 协议具有自身或关联的类型要求,并且不能用作声明的类型和
- 我不能继承
ObservableObject,因为它有 @Published 属性包装的成员,不能被覆盖。
【问题讨论】:
标签:
swift
swiftui
combine
【解决方案1】:
目前我看到的唯一方法是编写一个订阅ObservableObject 的模拟订阅者:
final class SomeState: ObservableObject {
@Published var someValue: String?
}
如果ObservableObject 看起来像这样,您可以像这样实现模拟订阅者(我称它们为Watcher):
final class SomeStateWatcher {
let someState: SomeState
var didSetSomeValue: Bool = false
var lastSomeValue: String?
private var someValueSubscriber: AnyCancellable?
init(someState: SomeState) {
self.someState = someState
self.someValueSubscriber = self.someState.$someValue
.sink(receiveValue: { value in
self.didSetSomeValue = true
self.lastSomeValue = value
})
}
}
func testDoStuffThatChangesTheLocalSomeStateProperty() {
someImplementation.doStuffThatChangesTheLocalSomeStateProperty(with: "Fourty2")
XCTAssertTrue(someStateWatcher.didSetSomeValue, "It should have published someValue")
XCTAssertEqual(someStateWatcher.lastSomeValue, "Fourty2", "It should have published the correct value)
}