Макет и вставка ObservableObject - PullRequest
1 голос
/ 04 марта 2020

У меня есть класс Foo, который имеет несколько зависимостей от ObservableObject. В целях тестирования я хочу создать смоделированную версию этих объектов, но не могу найти способ сделать это, а затем внедрить их в Foo.

  • Я не могу создать другой протокол, который мой ObservableObject реализуется, потому что протокол ObservableObject имеет собственные требования или требования к связанным типам и не может использоваться как объявленный тип, а
  • Я не могу создать подкласс ObservableObject, так как он имеет @Published члены с переносом свойств, которые не могут перезаписать.

1 Ответ

0 голосов
/ 04 марта 2020

На данный момент единственный способ, которым я вижу, - написать фиктивного подписчика, который подписывается на 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)
}
...