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)
}