【问题标题】: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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 2013-03-15
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      相关资源
      最近更新 更多