闽公网安备 35020302035485号
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() {
// 一些逻辑代码
}
}
方法二:使用 TestHooks3.建议将钩子扩展放在 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 访问私有方法
}
}