如何在 swift 测试中使用用户定义的配置变量作为 @testable 导入中的模块名称?

How to use a user defined config variable as module name in @testable import in a swift test?

我有一个用户定义的变量 "MODULE_NAME_WITH_SUFFIX",每个模式都不同。

现在我需要在我的测试中导入这个模块名称,但不知道如何。

在我进行简单导入之前:

@testable import MyApp

现在我想使用类似的东西:

@testable import $(MODULE_NAME_WITH_SUFFIX)

这在 Swift 中有可能吗?

可能不会,但以后是否可以通过编程方式导入模块?

不幸的是,这在 Swift 中是不可能的。但是,您可以在 Objective-C 中使用预处理器执行此操作,因为实际的 header 名称将在编译时被替换。不过,这当然会要求您在 Objective-C 中编写测试。

到目前为止只有这个有效:

在项目的构建设置中,转到活动编译条件并将这些字段添加到方案中。

在每个架构配置中创建一个唯一变量:

# in debug scheme 1
DEBUG ABC_SCHEMA_ACTIVE

# in debug scheme 2
DEBUG XYZ_SCHEMA_ACTIVE

# in debug scheme 3
DEBUG

# in release scheme 1
ABC_SCHEMA_ACTIVE

# in release scheme 2
XYZ_SCHEMA_ACTIVE

# in release scheme 3
< nothing >

不用给它设值,用#if不能比较值

在 Test-Target 的构建设置中,您可以像这样使用 MODULE_NAME_WITH_SUFFIX:

# before
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp";

# after
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/$(MODULE_NAME_WITH_SUFFIX).app/$(MODULE_NAME_WITH_SUFFIX)";

然后在从 XCTestCase 派生的每个 class 中,添加这个怪物而不是正常导入:

#if ABC_SCHEMA_ACTIVE
    @testable import MyAppABCSuffix
#elseif XYZ_SCHEMA_ACTIVE
    @testable import MyAppXYZSuffix
#else
    @testable import MyApp
#endif

测试愉快!

另一种选择是使用 canImport 作为条件。

#if canImport(MyApp)
    @testable import MyApp
#endif

#if canImport(MyApp_Dev)
    @testable import MyApp_Dev
#endif