iphone - 无法在基本单元测试设置中测试我的类(class)

标签 iphone objective-c ios xcode unit-testing

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

当我尝试测试特定类(class)时,事情开始走下坡路。

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

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

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

更新 1 听从了 Carl 的建议,但无法通过第 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 添加到“Build Phases/Compile Sources”,然后沿着无穷无尽的路径将所有其他 .m 文件添加到测试目标的“Compile Sources”。

最佳答案

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

1) 从测试目标中删除所有非测试用例类实现 (.m) - 它们不需要存在。通过将它们从测试目标的构建阶段的“编译源” Pane 中删除来执行此操作。

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

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

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

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

关于iphone - 无法在基本单元测试设置中测试我的类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12718057/

相关文章:

iphone - 更改 iPhone 中超链接的颜色

ios - 添加为 subview 时未调用 UIViewController viewWillAppear

Objective-C 类型检查 block ?

iphone - 无法在通用应用程序中使用 UISplitViewController?

iphone - 为 NSURLRequest 生成 URL 字符串失败启动

ios - ____ 没有可见的@interface 声明选择器

ios - 无法在 WKwebview 中加载重定向 URL(登录 URL)

ios - Core Plot - 绘制较少点时的 X 轴移动位置

ios - 带有 UIWebview 的 UITableViewCell,可根据内容大小调整高度

iphone - 合并截图并生成pdf文件