本文内容不多,我将告诉您在混合的但相当古老的ObjectiveC + Swift项目中创建测试目标时出现了哪些问题,以及如何解决这些问题。
令人困惑的第一件事:一个测试目标中的错误可能会影响从另一个测试目标启动自动测试。 您可以在项目中添加任意数量的测试目标,它们通常基于项目的主要目标,并会自动添加到其启动方案中。 因此,在此方案上运行任何自动测试时,其余程序将编译,并且其中一个测试目标上的错误将干扰其他目标的启动。 为了隔离这种影响,可以为不同的测试目标创建不同的方案。
我将附上一个非常简单的屏幕截图,仅是为了清楚起见:


下一个问题是Objecive-C和Swift之间的依赖关系。
在您的项目中创建:
MyProject-Bridging-Header.h :该文件包含swift中使用的ObjectiveC头文件的名称。
MyProject-swift.h :它隐式为ObjectiveC类中使用的swift类创建代码。
MyProject-Prefix.pch :预编译文件还可以以不同方式包含依赖项,包括类似以下的构造:
#ifdef __OBJC__ #import "MyProject-Swift.h" #endif
您的自动测试也可以创建此类依赖关系。 当添加第一个swift文件时,Xcode会为该测试目标创建一个桥头文件。 这一切都像一个魅力。 从理论上讲,桥头自动测试的内容应与主桥互补,但实际上会发生替换。 因此,为了能够在自动测试中访问项目的所有类,在此选项中,我指定了主要目标的桥头(上图)。
转到Xcode
Target-> BuildSetting并检查以下参数:
Objective-C桥接标头Objective-C生成的接口头名称指定主要目标文件。
但是,如果拉主桥接头,则所有依赖项都将开始扩展。 因此,您还必须使用主项目中的数据填写以下参数:
框架搜索路径标头搜索路径图书馆搜索路径其他链接器标志运行路径搜索路径不需要更改。
然后发现了另一个奇怪的问题:
由于某些原因,在较旧的项目中,为测试目标分配了与主要目标相同的
产品模块名称 。 这并没有停止孤立的ObjectiveC,但是在向项目中添加快捷方式时,出现了两个问题。
第一个问题是在这种情况下
@testable import MyProject
自动测试文件将被忽略,您将无法访问Swift类。
第二个问题是,这样的目标在编译时会覆盖主要目标的MyProject-swift,并阻止其他目标进行编译。 该参数需要重命名。
在此基础上,我的自动测试开始并且能够使用项目文件,我也希望您能这样做!
我不经常从事项目设置工作,因此欢迎您提供有关此主题的所有实用评论和建议。
谢谢所有阅读它的人。