使 swift 内部函数对测试目标不可用

Make swift internal function unavailable for Test Target

我想创建一个 class 的函数或便利初始化,当使用 @testable import 导入时,它不能用于 TestTarget,我不确定它是可能,但正在寻找任何方法来限制它。

class A {
   // Should not be accessible in Test Target
   func foo() {
   }
}

在测试中 @testable import 它应该不可用。

/********** 更新 ***********/

问题陈述

Long param init 方法与便利方法一起使用以提供默认参数,但在测试中,我不想使用默认参数访问该便利方法,因为很容易忘记提供模拟依赖性。

将该函数标记为 Private。那么它将无法在测试目标中使用。

您不能从另一个模块访问私有实体,这也适用于测试目标。这就是访问控制的目的。

有两种解决方案。

  1. 您可以在您的 init
  2. 中添加以下代码
#if DEBUG
if let _ = NSClassFromString("XCTest") {
    fatalError("Should not be used in unit test.")
}
#endif

使用此解决方案,您仍然可以在单元测试中使用此 init,但它会在运行时崩溃。

  1. 添加一个新的配置Testing,你可以通过Select your debug config -> Click + -> Duplicate Debug来完成,并重命名为Testing

然后在您的主要目标中,在配置 Testing 中添加一个新标志 TESTING

接下来转到 Product -> Scheme -> Edit Scheme 为您的 Test 将构建配置设置为 Testing

最后在您的 init 周围添加这个。

#if !TESTING
init() {}
#endif

现在,您应该无法在单元测试中使用此 init

您可以 import 模块而不是 @testable import