Swift 模拟并注入可观察对象
我有一个类Swift 模拟并注入可观察对象,swift,swiftui,combine,Swift,Swiftui,Combine,我有一个类Foo,它对observateObject有多个依赖项。出于测试目的,我想创建这些对象的模拟版本,但我看不到这样做的方法,然后将它们注入Foo 我无法创建我的observegeobject实现的另一个协议,因为observegeobject协议具有自身或关联的类型要求,并且不能用作声明的类型和 我无法将ObservableObject子类化,因为它已发布了@无法覆盖的属性包装成员 目前,我看到的唯一方法是编写一个订阅可观察对象的模拟订阅者: final class SomeState
Foo
,它对observateObject
有多个依赖项。出于测试目的,我想创建这些对象的模拟版本,但我看不到这样做的方法,然后将它们注入Foo
- 我无法创建我的
实现的另一个协议,因为observegeobject
协议具有自身或关联的类型要求,并且不能用作声明的类型和observegeobject
- 我无法将
子类化,因为它已发布了ObservableObject
属性包装成员@无法覆盖的
可观察对象的模拟订阅者
:
final class SomeState: ObservableObject {
@Published var someValue: String?
}
如果observeObject
看起来像这样,您可以实现模拟订阅者(我称之为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)
}