You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加自定义Configuration后TUIST下EventTracking模块无法编译测试

问题:自定义Configuration下EventTracking框架测试报错"Module 'EventTracking' was not compiled for testing"

拆分大型单体项目为子模块时,为EventTracking框架编写测试,在import EventTracking前添加@testable宏会触发错误:"Module 'EventTracking' was not compiled for testing"。项目需适配多服务器,配置了多个自定义Configuration(如Develop-Debug、Stage-Debug等),EventTracking依赖的Internal_Framework_With_Helpers和Internal_Networking_Framework也配置了相同的自定义Configuration。所有项目可正常生成并构建,但测试时出现上述错误;移除EventTracking的自定义Configuration后测试可正常执行,但整个项目会出现大量构建错误。

以下是EventTracking的Project.swift代码:

let project = Project(
    name: "EventTracking",
    organizationName: "com.organizationName",
    options: .options(
        automaticSchemesOptions: Project.Options.AutomaticSchemesOptions.enabled(
            targetSchemesGrouping: .byNameSuffix(
                build: [
                    "",
                    "Interface",
                    "Testing"
                ],
                test: ["Tests"],
                run: []
            ),
            codeCoverageEnabled: true,
            testingOptions: []
        )
    ),
    settings: .settings(
        base: [
            "OTHER_LDFLAGS": "$(inherited) -ObjC"
        ],
        configurations: [
            .debug(name: "Develop-Debug"),
            .debug(name: "Stage-Debug"),
            .debug(name: "Prod-Debug"),
            .debug(name: "Test1-Debug"),
            .debug(name: "Test2-Debug"),
            .debug(name: "Test3-Debug"),
            .debug(name: "Test4-Debug"),
            .release(name: "Develop-Release"),
            .release(name: "Stage-Release"),
            .release(name: "Prod-Release"),
            .release(name: "Test1-Release"),
            .release(name: "Test2-Release"),
            .release(name: "Test3-Release"),
            .release(name: "Test4-Release"),
            ],
        defaultSettings: .recommended
    ),
    targets: [
        .target(
            name: "EventTracking",
            destinations: [
                .iPhone,
                .macWithiPadDesign
            ],
            product: .framework,
            bundleId: "com.organizationName.EventTracking",
            deploymentTargets: DeploymentTargets.iOS("15.0"),
            sources: .paths(
                ["Sources/**/*.swift"]
            ),
            dependencies: [
                TargetDependency.package(
                    product: "AppsFlyerLib"
                ),
                TargetDependency.project(
                    target: "Internal_Framework_With_Helpers",
                    path: .relativeToRoot("Projects/Internal_Framework_With_Helpers")
                ),
                TargetDependency.project(
                    target: "Internal_Networking_Framework",
                    path: .relativeToRoot("Projects/Internal_Networking_Framework")
                )
            ],
            settings: .settings(
                base: [
                    "DEVELOPMENT_ASSET_PATHS" : [""]
                ],
                configurations: [],
                defaultSettings: .recommended
            )
        ),
        .target(
            name: "EventTrackingTests",
            destinations: [
                .iPhone,
                .macWithiPadDesign
            ],
            product: .unitTests,
            bundleId: "com.organizationName.EventTrackingTests",
            deploymentTargets: DeploymentTargets.iOS("15.0"),
            sources: .paths(
                ["Tests/**/*.swift"]
            ),
            dependencies: [
                TargetDependency.project(
                    target: "EventTracking",
                    path: .relativeToRoot("Projects/Data/EventTracking")
                ),
                TargetDependency.project(
                    target: "Internal_TestingSupport_Framework",
                    path: .relativeToRoot("Projects/Data/Internal_TestingSupport_Framework")
                )
            ],
            settings: .settings(
                base: [
                    "DEVELOPMENT_ASSET_PATHS" : [""]
                ],
                configurations: [],
                defaultSettings: .recommended
            )
        )
        
    ],
    additionalFiles: [],
    resourceSynthesizers: [
        .assets(),
        .files(extensions: ["json"]),
    ]
)

问题分析

这个错误的核心是测试目标与主框架的自定义Configuration未完全对齐:

  1. 主框架EventTracking定义了多套自定义Debug/Release Configuration,但测试目标EventTrackingTests的configurations字段为空,默认仅使用标准的Debug/Release配置,两者配置不匹配。
  2. Xcode执行测试时,要求测试目标和被测目标使用完全一致的Configuration,否则无法找到带有ENABLE_TESTABILITY=YES标记的框架编译产物,从而触发该错误。
  3. 依赖的Internal框架同样使用自定义Configuration,进一步放大了配置不匹配的问题。

解决方法

要保留自定义Configuration同时让测试正常运行,需确保测试目标与主框架的配置完全对齐,具体步骤如下:

1. 为测试目标添加与主框架一致的自定义Configuration

修改EventTrackingTests的settings配置,添加和主框架完全相同的自定义Debug/Release Configuration:

.target(
    name: "EventTrackingTests",
    // 保留原有destinations、product、bundleId等配置
    settings: .settings(
        base: [
            "DEVELOPMENT_ASSET_PATHS" : [""]
        ],
        configurations: [
            .debug(name: "Develop-Debug"),
            .debug(name: "Stage-Debug"),
            .debug(name: "Prod-Debug"),
            .debug(name: "Test1-Debug"),
            .debug(name: "Test2-Debug"),
            .debug(name: "Test3-Debug"),
            .debug(name: "Test4-Debug"),
            .release(name: "Develop-Release"),
            .release(name: "Stage-Release"),
            .release(name: "Prod-Release"),
            .release(name: "Test1-Release"),
            .release(name: "Test2-Release"),
            .release(name: "Test3-Release"),
            .release(name: "Test4-Release"),
        ],
        defaultSettings: .recommended
    )
)

2. 确保依赖的测试支持框架配置一致

确认Internal_TestingSupport_Framework也包含所有自定义Configuration,避免测试目标编译时出现依赖找不到的问题。

3. 验证Scheme的Configuration映射

检查自动生成的Scheme,确保测试阶段的Configuration与主框架当前使用的Configuration匹配:

  • 打开Xcode的Scheme编辑器(Product > Scheme > Edit Scheme)
  • 切换到Test标签,确认每个测试目标的Build Configuration和主框架的Configuration一一对应(如Develop-Debug对应Develop-Debug)

4. 强制开启Debug类配置的测试支持

在主框架的base settings中添加ENABLE_TESTABILITY = YES,确保所有Debug类型的自定义Configuration都开启测试支持:

settings: .settings(
    base: [
        "OTHER_LDFLAGS": "$(inherited) -ObjC",
        "ENABLE_TESTABILITY": "YES"
    ],
    // 保留原有configurations和defaultSettings配置
)

内容的提问来源于stack exchange,提问作者kroumvud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 10:35:09