Swift单元测试如何验证viewDidLoad中fetchData函数是否被调用
Swift 测试 viewDidLoad 内方法调用的实现方案
原生子类化Mock方案(无第三方依赖,优先推荐)
Swift 原生测试无需依赖类似 OCMock 的动态 mock 框架,通过子类化重写目标方法即可实现调用状态校验:
- 定义测试专用的视图控制器子类,重写
fetchData方法,新增调用状态标记:
@testable import 你的App主模块名 class TestableTargetViewController: 你的原视图控制器类名 { // 标记fetchData是否被调用 private(set) var isFetchDataCalled = false override func fetchData() { isFetchDataCalled = true // 若需要保留原方法逻辑,可补充 super.fetchData() } }
- 编写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
相关产品推荐
相关产品推荐

