背景:我想使用 XCTest 测试私有方法,因此我正在寻找一种优雅的解决方案将私有方法暴露给我的 XCTestCase 类。
免责声明:有些人认为测试类的内部是根本错误的。但在实践中,当测试失败时,测试私有方法可以使追踪问题变得更加容易。
Swift 的私有函数是文件私有的,并且私有确实意味着私有,因此没有办法将私有函数暴露给其他文件。使用预处理器宏,可以通过公共函数仅为一个构建配置公开私有功能。例如,我为我的测试配置设置了一个 TEST 编译标志,我的测试方案就可以使用它。
到目前为止,这是我拥有的最佳解决方案,但它需要针对每个需要测试的私有函数使用烦人的样板代码:
在 ClassThatNeedsTesting.swift 中:
在 TestClass.swift 文件中:
在 TestClass.swift 文件中:
如果没有其他方法,也许有一个更简单的解决方案?
免责声明:有些人认为测试类的内部是根本错误的。但在实践中,当测试失败时,测试私有方法可以使追踪问题变得更加容易。
Swift 的私有函数是文件私有的,并且私有确实意味着私有,因此没有办法将私有函数暴露给其他文件。使用预处理器宏,可以通过公共函数仅为一个构建配置公开私有功能。例如,我为我的测试配置设置了一个 TEST 编译标志,我的测试方案就可以使用它。
到目前为止,这是我拥有的最佳解决方案,但它需要针对每个需要测试的私有函数使用烦人的样板代码:
在 ClassThatNeedsTesting.swift 中:
class ClassThatNeedsTesting {
#if TEST
func publicAccessToPrivateFunctionThatNeedsTesting() -> Bool {
return self.privateFunctionThatNeedsTesting()
}
#endif
private func privateFunctionThatNeedsTesting() -> Bool {
return true;
}
}
在 TestClass.swift 文件中:
class TestClass: XCTestCase {
func testExample() {
XCTAssert(ClassThatNeedsTesting().publicAccessToPrivateFunctionThatNeedsTesting());
}
}
但是有没有使用内联预处理宏来简化这个过程的方法呢?这正是我想要的,但它不能编译,所以我才会问这个问题:
在ClassThatNeedsTesting.swift文件中:
class ClassThatNeedsTesting {
#if TEST private #endif func privateFunctionThatNeedsTesting() -> Bool {
return true;
}
}
在 TestClass.swift 文件中:
class TestClass: XCTestCase {
func testExample() {
XCTAssert(ClassThatNeedsTesting().privateFunctionThatNeedsTesting());
}
}
如果没有其他方法,也许有一个更简单的解决方案?
@testable
导入{ModuleName},以使所有公共和内部例程可供XCTest目标使用。”@testable
仅适用于公共和内部例程,而不适用于私有例程。 - kev