我已成功将正常的单元测试包添加到我的项目following these instructions。我可以构建并运行我的测试目标,一个样本测试工作正常。
当我尝试测试特定课程时,事情开始走下坡路。
在我的应用程序中,我的许多.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文件添加到测试目标的“编译源”的无尽路径。
答案 0 :(得分:1)
代码绝对可以用使测试变得困难的方式编写,特别是当它没有考虑到测试时。但这并非不可能。现在你只需要清理你的进口。我认为我采取的方法是
1)从测试目标中删除所有非测试用例类实现(.m) - 它们不需要在那里。通过从测试目标的构建阶段的“编译源”窗格中删除它们来执行此操作。
2)将所有PCH导入复制到测试用例中(暂时)。导入"MyModel.h"
。尝试获取MyModel
的实例并测试它不是nil
并且具有正确的类。如果需要,只需继续添加导入但不添加.m的。
3)这个和下一个步骤是可选的,但我强烈推荐它们,因为它们可能会揭示代码中的麻烦区域,这将阻止您编写细粒度的测试。一旦你完成了那个简单的测试,就该开始清理你的导入了。切换回您的主项目。首先,我开始从pch中删除你自己的任何类(不计算库/框架类型导入)。一次从pch中删除标题,然后将它们导入真正需要它们的文件中。
3a)当您正在完成此过程时,请确保从其他头文件中导入尽可能少的文件。在一些情况下,你的.h中只应该有一个#import,通常:1)对导入文件中声明的类进行子类化2)实现导入文件中声明的协议3)引用导入文件中定义的任何C类型。对于协议和类,使用标题中的@protocol和@class对它们进行前向声明,并仅将它们导入实际发送消息或访问其属性的位置(通常在.m中)
所以,在这一点上,你应该有一个单独的通过单元测试和一个更清洁的pch。确保现在清理单元测试中的导入。切换回测试目标,开始编写更多测试。当您使界面更具针对性和可测试性时,导入文件的需求将减少。希望这有帮助!
答案 1 :(得分:1)