class SomeClass { private func somePrivateMethod() { // 一些逻辑代码 } }尝试在单元测试中调用 somePrivateMethod,会发现无法访问,并会产生编译错误:“'somePrivateMethod' 由于 'private' 保护级别而无法访问”,这很容易理解。
class SomeClassTests: XCTestCase { func testSomePrivateMethod() { let testTarget = SomeClass() testTarget.somePrivateMethod() // 错误:无法访问私有方法 } }那么我们该如何解决这个问题呢?如果 somePrivateMethod 包含一些业务逻辑,单元测试一定要能够覆盖,那么我们就必须找到其他可行的方法。
public class SomeClass { public func somePrivateMethod() { // 一些逻辑代码 } }方法二:使用 TestHooks
3.建议将钩子扩展放在 DEBUG 宏中,以避免误用。
#if DEBUG // 在 debug 宏下添加以避免误用,并避免在发布环境中暴露私有方法 extension SomeClass { // 在类的扩展中编写,我们希望访问其私有方法 var testHooks: TestHooks { // testHooks 的实例,通过它我们将在单元测试中访问私有方法 TestHooks(target: self) // 使用 self 初始化以访问 self 的私有方法 } struct TestHooks { // TestHooks 结构体,其中包含我们希望访问的所有属性和方法的钩子 var target: SomeClass // 需要访问其私有方法的目标 func somePrivateMethod() { // 暴露方法的钩子 target.somePrivateMethod() // 暴露该方法 } } } #endif这样一来,我们可以在单元测试文件中通过 testHooks 访问 somePrivateMethod:
class SomeClassTests: XCTestCase { func testSomePrivateMethod() { let testTarget = SomeClass() testTarget.testHooks.somePrivateMethod() // 通过 testHooks 访问私有方法 } }