如何让XCTestCase中appSettings仅初始化一次(规避单例弊端)
问题描述
在以下代码中,appSettings变量会在每个测试用例中初始化一次。如何实现让它在整个测试类中仅初始化一次?如果使用单例,当多个测试类同时运行时会出现问题,因为它会在所有测试类中仅初始化一次。
final class TestsmthTests: XCTestCase { var appSettings = AppSettings() override func setUpWithError() throws { } func testExample() throws { } func testMore() throws { } }
解决方案
你可以借助XCTest的类级别初始化方法,配合静态变量实现需求。静态变量属于测试类本身,每个测试类的静态变量相互独立,既保证单个测试类内只初始化一次,又不会影响其他测试类。
方案一:类级别的setUp方法
重写测试类的setUp类方法,在整个测试类运行前执行一次初始化操作:
final class TestsmthTests: XCTestCase { // 静态变量,属于当前测试类 static var appSettings: AppSettings! // 类级别的setUp,测试类所有用例执行前仅调用一次 override class func setUp() { super.setUp() appSettings = AppSettings() } // 可选:类级别的tearDown,测试类所有用例执行完毕后清理资源 override class func tearDown() { appSettings = nil super.tearDown() } func testExample() throws { // 通过类名访问静态变量 let settings = TestsmthTests.appSettings // 测试逻辑... } func testMore() throws { let settings = TestsmthTests.appSettings // 测试逻辑... } }
如果初始化过程可能抛出错误,iOS 13+、macOS 10.15+版本可以用类级别的setUpWithError:
override class func setUpWithError() throws { try super.setUpWithError() appSettings = try AppSettings() // 处理初始化可能的错误 }
方案二:静态常量直接初始化
利用Swift静态属性的延迟初始化特性,直接声明静态常量,它会在第一次被访问时初始化,且整个测试类生命周期内仅初始化一次:
final class TestsmthTests: XCTestCase { // 静态常量,自动延迟初始化,单个测试类内仅初始化一次 static let appSettings = AppSettings() func testExample() throws { let settings = TestsmthTests.appSettings // 测试逻辑... } func testMore() throws { let settings = TestsmthTests.appSettings // 测试逻辑... } }
这种方式更简洁,无需重写类初始化方法,且不同测试类的静态常量相互独立,不会出现跨类干扰的问题。
内容的提问来源于stack exchange,提问作者Dmitrii Bakulin
相关产品推荐
相关产品推荐

