3

按照这些说明,我已经成功地将一个普通的单元测试包添加到我的项目中。我可以构建并运行我的测试目标,并且一个示例测试工作正常。

当我尝试测试特定课程时,事情开始走下坡路。

在我的应用程序中,我的许多 .h 文件都包含在 .pch 文件中。此外,MyModel 与其他类交互。因此,当我导入 MyModel.h 并在我的测试中使用它时,我收到一堆错误,这些错误与无法加载其他文件有关。我的解决方法是在我的测试目标的 .pch 文件中简单地添加相同的文件,并将这些文件添加到测试目标的“编译源”列表中。

所以我将这些类添加到测试目标和 .pch 中,尝试运行,但我最终陷入了无限循环,总是需要更多文件。当我最终将每个 .m 添加到我的项目中时,运行测试仍然非常失败。

知道我需要如何正确设置我的项目,以便我可以简单地#import "MyModel.h"进入我的测试文件并编写/运行我的测试吗?我的项目是否有可能以一种无法进行测试的方式进行配置?

更新 1 遵循卡尔的建议,但无法通过第 2 步。我得到:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_MyModel", referenced from:
      objc-class-ref in BaseUnitTests.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

正是在这一点上,我将 MyModel.m 添加到“构建阶段/编译源”,并沿着将所有其他 .m 文件添加到测试目标的“编译源”的无尽路径。

4

2 回答 2

1

代码绝对可以以使测试变得困难的方式编写,尤其是在编写时没有考虑到测试。但这并非不可能。现在你只需要清理你的导入。我认为我会采取的方法是

1)从测试目标中删除所有非测试用例类实现(.m)——它们不需要在那里。通过从测试目标的构建阶段的“编译源”窗格中删除它们来做到这一点。

2) 将所有 PCH 导入复制到您的测试用例中(暂时)。导入"MyModel.h". 尝试获取一个实例MyModel并测试它不是nil并且具有正确的类。如果需要,请继续添加导入,但不要添加 .m。

3) 这一步和下一步是可选的,但我强烈推荐它们,因为它们可能会揭示代码中的问题区域,从而阻止您编写细粒度的测试。一旦你通过了这个简单的测试,就该开始清理你的导入了。切换回您的主项目。首先,我将开始从 pch 中删除您自己的任何类(不包括库/框架类型导入)。一次从 pch 中删除一个标题,并将它们导入真正需要它们的文件中。

3a) 在您完成此过程时,请确保从其他头文件中导入尽可能少的文件。在少数情况下,您的 .h 中应该只包含 #import,通常:1) 子类化导入文件中声明的类 2) 实现导入文件中声明的协议 3) 引用导入文件中定义的任何 C 类型. 对于协议和类,在标头中使用 @protocol 和 @class 前向声明它们,并且仅在您实际向它们发送消息或访问它们的属性的地方(通常在您的 .m 中)导入它们

因此,此时,您应该有一个通过的单元测试和一个更干净的 pch。确保现在清理单元测试中的导入。切换回您的测试目标,并开始编写更多测试。随着您使界面更加专注和可测试,导入文件的需求将会减少。希望这可以帮助!

于 2012-10-03T23:43:32.083 回答
1

我遇到了同样的问题,只需将 xxx-Prefix.pch 文件路径添加到我的测试目标的GCC_PREFIX_HEADER即可解决,就像我对主应用程序目标所做的那样:

在此处输入图像描述

于 2016-01-22T05:51:45.313 回答