You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试PassthroughSubject在类初始化时是否已被正确订阅

测试PassthroughSubject是否正确订阅的方法

你可以通过以下两种常用的方案验证,不需要修改原有业务逻辑的核心逻辑:

方案一:通过订阅副作用验证(最常用,无侵入)

初始化目标类之后,给viewType发送一个测试用的ViewType枚举值,校验对应触发的属性、其他Publisher的输出是否符合预期即可。
示例测试代码(基于XCTest):

import XCTest
import Combine

final class YourClassTests: XCTestCase {
    // 存储测试用的订阅
    private var cancellables = Set<AnyCancellable>()

    func testViewTypeSubjectIsSubscribedOnInit() {
        // 1. 初始化目标类,此时会自动执行init内的setupObservers方法
        let testInstance = YourTargetClass()
        // 2. 构造测试用的ViewType枚举值
        let testViewType = ViewType.yourTestEnumCase // 替换为你实际的枚举case
        // 3. 提前订阅需要校验的输出Publisher,比如titleText
        let titleExpectation = expectation(description: "titleText receives correct value")
        testInstance.titleText
            .sink(receiveValue: { outputTitle in
                XCTAssertEqual(outputTitle, testViewType.title)
                titleExpectation.fulfill()
            })
            .store(in: &cancellables)
        // 同样可以添加hideXButton、reloadTableView的触发预期
        let reloadExpectation = expectation(description: "reloadTableView is triggered")
        testInstance.reloadTableView
            .sink(receiveValue: { _ in
                reloadExpectation.fulfill()
            })
            .store(in: &cancellables)
        // 4. 给viewType发送测试值,如果viewType是private权限,可通过@testable import引入模块后访问,或者改为fileprivate权限
        testInstance.viewType.send(testViewType)
        // 5. 等待预期触发,超时设1秒足够
        waitForExpectations(timeout: 1)
        // 额外校验currentViewType也被正确赋值
        XCTAssertEqual(testInstance.currentViewType, testViewType)
    }
}

如果所有预期都能正常触发,就说明viewType的订阅在初始化时已经生效。

方案二:直接校验订阅存储集合

如果你的publishers(存储Cancellable的集合)可以被测试代码访问,你可以直接校验初始化后该集合的数量是否符合预期:

  • 如果你只有viewType这一个订阅,初始化实例后直接断言publishers的count等于1即可
  • 可以补充边界测试:跳过setupObservers方法初始化实例,校验此时publishers为空,排除其他逻辑添加订阅的干扰

注意事项

如果viewType、publishers这些属性是private权限,你可以在测试target引入主模块时添加@testable import 你的模块名,就可以访问internal、fileprivate级别的属性,不要为了测试把核心属性改为公开权限。

内容的提问来源于stack exchange,提问作者Wazza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:18:02