You need to enable JavaScript to run this app. Swift单元测试如何验证viewDidLoad中fetchData函数是否被调用
优惠活动
大模型
产品
解决方案
定价
更多

Swift单元测试如何验证viewDidLoad中fetchData函数是否被调用

Swift 测试 viewDidLoad 内方法调用的实现方案

原生子类化Mock方案(无第三方依赖,优先推荐)

Swift 原生测试无需依赖类似 OCMock 的动态 mock 框架,通过子类化重写目标方法即可实现调用状态校验:

  1. 定义测试专用的视图控制器子类,重写fetchData方法,新增调用状态标记:
@testable import 你的App主模块名

class TestableTargetViewController: 你的原视图控制器类名 {
    // 标记fetchData是否被调用
    private(set) var isFetchDataCalled = false

    override func fetchData() {
        isFetchDataCalled = true
        // 若需要保留原方法逻辑,可补充 super.fetchData()
    }
}
  1. 编写XCTest测试用例:
import XCTest
@testable import 你的App主模块名

class TargetViewControllerTests: XCTestCase {
    func testViewDidLoadTriggersFetchData() {
        // 初始化mock子类实例
        let testVC = TestableTargetViewController()
        // 触发系统视图加载流程,自动调用viewDidLoad
        testVC.loadViewIfNeeded()
        // 校验调用状态
        XCTAssertTrue(testVC.isFetchDataCalled)
    }
}

注意事项

  • 禁止直接手动调用viewDidLoad()方法,loadViewIfNeeded()会触发完整的系统视图加载生命周期,测试结果和实际运行场景一致。
  • 若fetchData为private访问权限,需修改为默认的internal访问级别,测试模块才可重写该方法。

可选拓展方案

如果你的代码已经做了协议抽象,可采用协议Mock方式进一步解耦:将fetchData定义在独立协议中,给视图控制器注入协议实现实例,测试时传入遵守协议的Mock对象记录调用状态即可。
若需要动态Mock能力,也可引入第三方框架如Cuckoo,但配置成本高于原生子类方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:54:01