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

如何在Objective-C单元测试中同时调用App与Test目标的Swift文件?

解决Objective-C单元测试中独立引用App/Test目标Swift文件的模块找不到问题

问题场景

在Objective-C单元测试代码中,需要分别调用App目标和Test目标各自的Swift文件,但不想将App目标的Swift文件归属到Test目标。此时Test目标自动生成的<test-target>-swift.h文件中,@import <app-target>行提示“Module not found”,即便已配置Host Application、允许测试Host API、开启App模块定义并添加DerivedSources搜索路径,问题仍存在,项目已集成CocoaPods。

解决方案

1. 补全Test目标的模块依赖配置

  • 进入Test目标的Build Phases > Link Binary With Libraries,点击+按钮,找到并添加App目标的模块(若App是动态框架,直接选对应的.framework;若是静态库,确保App目标的产物已被正确链接)。
  • 检查App目标的Build Settings > Packaging > Product Module Name,确认<test-target>-swift.h中@import的模块名与该值完全一致(注意项目名含空格时会被转成下划线,避免拼写错误)。

2. 修正DerivedSources搜索路径

  • 将Test目标的Header Search Paths和User Header Search Paths修改为递归搜索:
    $(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources/**
    $(CONFIGURATION_TEMP_DIR)/$(APP_TARGET_NAME).build/DerivedSources/**
    
    把路径设置为Recursive(递归),确保Xcode能找到嵌套路径下的桥接文件。若不确定变量是否正确,可先手动填入DerivedSources的实际绝对路径测试,验证有效后再换回变量。

3. 处理CocoaPods的配置冲突

  • CocoaPods会自动覆盖部分项目配置,可在Podfile中为Test目标添加对App目标的依赖,让CocoaPods自动处理模块引用:
    target 'YourAppTarget' do
      use_frameworks!
      # 你的App依赖的Pods
    end
    
    target 'YourTestTarget' do
      inherit! :search_paths
      use_frameworks!
      # 显式添加对App目标的依赖
      pod 'YourAppTarget', :path => '.'
    end
    
  • 执行pod install后,CocoaPods会自动配置Test目标对App模块的引用路径,解决模块找不到的问题。

4. 手动管理Test目标的桥接文件(备选方案)

  • 在Test目标的Build Settings > Swift Compiler - General > Objective-C Generated Interface Header Name中,自定义桥接文件名(比如TestCustomSwiftBridge.h)。
  • 手动创建该文件,只声明Test目标自身的Swift类,同时手动添加#import "<app-target>-swift.h"(需确保该路径指向App目标生成的桥接文件,可通过绝对路径或正确的相对路径配置),替代Xcode自动生成的桥接文件内容。

结论

Xcode本身不存在此类限制,问题多由配置细节遗漏或CocoaPods自动配置冲突导致,按照上述步骤调整即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:35:44