首页 > 解决方案 > 订阅了测试 PassthroughSubject

问题描述

我想测试我的一些 PassthroughSubjects 在我的班级初始化时被订阅

我的类初始化很简单:

  private let viewType = PassthroughSubject<ViewType, Never>()

  init() {
    setupObservers()
  }

  func setupObservers() {
    viewType
      .sink(
        receiveValue: { [weak self] viewType in
          guard let self = self else {
            return
          }
          self.currentViewType = viewType
          self.titleText.send(viewType.title)
          self.hideXButton.send(viewType.shouldHideXButton)
          self.reloadTableView.send()
        })
      .store(in: &publishers)
   }

如何测试 viewType 已被订阅?

标签: swift

解决方案


在序列中间添加一个“打印”运算符:

func setupObservers() {
  viewType
    .print() /* <<< -- Print debugging information*/
    .sink(
      receiveValue: { [weak self] viewType in
    /* Your other code here */

它将打印有关通过序列的值的调试信息,包括订阅者何时订阅它。

显然,您应该只在开发时使用它。

就您而言,XCTest您询问如何测试您的发布者是否已订阅。该.sink运算符在您的代码中内联并且会进行订阅,因此不清楚您要使用XCTest. 您可以在变量中捕获取消返回,将其存储在您的publishers集合中并验证取消是否在集合中,以确保调用您的代码。但是,由于您的订阅是代码所固有的,因此只要代码运行,它就应该始终完成。


推荐阅读