objective-c - Foo 类在 MyApp 和 MyAppTestCase 中都实现了。将

最近我开始对我的应用程序进行单元测试。这个项目(在 Xcode4 中)是在没有单元测试包的情况下创建的,所以我必须设置它。 我已按照此处的步骤操作:http://cocoawithlove.com/2009/12/sample-mac-application-with-complete.html 它对于简单的类效果很好,但现在我正在尝试测试一个依赖于另一个类和另一个类等的类。

首先我遇到了一个链接器错误,所以我将 *.m 文件添加到了测试用例目标中,但现在我收到了我要测试的每个类的警告:

Class Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined.

我想知道这是为什么?我该如何解决这个问题?也许我在设置单元测试目标时遗漏了什么?

编辑 - 解决方案

  • 将“Bundle Loader”正确设置为 $(BUILT_PRODUCTS_DIR)/AppName.app/AppName

  • 将“默认隐藏的符号”设置为 NO(在目标应用程序的build设置中)。这是链接器错误的来源,因为默认情况下它是 YES!。我已经为此苦苦挣扎了这么久!

来源:Linking error for unit testing with XCode 4?

最佳答案

Class Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined.

不知道为什么?

因为两个图像(应用程序和单元测试包)都定义了类的实现。该类被动态加载到 objc 运行时中。 objc 运行时使用平面命名空间。这是如何工作的:

  • 二进制文件被加载,从它的依赖项开始
  • 加载每个二进制文件时,objc 类都会在 objc 运行时注册
  • 如果具有特定名称的类被加载两次,则行为未定义。可以将一个类的实现(具有相同名称)加载到 objc 运行时中。

这里的典型问题是您将返回一个实现 - 当类型冲突时(当类不是来自同一源文件时),您的应用程序可能会崩溃。

您通常可以通过重命名类或将类导出到一个图像中来避免这种情况。重命名类(class)显然不适用于您的情况。您有一个文件 Foo.m 正在被两个图像编译、导出和加载,而它应该在一个文件中。

这应该被您解释为重复符号链接(symbolic link)器错误。即使实现是相同的源文件(并且实现是相同的) - 这是您必须解决的问题。

How can I solve this?

如果 Foo.m 是应用程序的一个类,您必须从单元测试中删除(不要编译和链接)Foo.m。如果它是单元测试的一部分,则不要编译并将其链接到单元测试目标中。

然后,按照帖子中的说明将您的单元测试链接/加载到应用程序。它在帖子的这个一般区域:其中“WhereIsMyMac”是您正在单元测试的应用程序的名称。这将使测试目标链接到应用程序(因此在编译时不会出现链接器错误)。重要的部分是您的测试文件(仅)在单元测试目标中编译,并且您的应用程序的类被编译并链接到应用程序中。您不能只添加它们 - 它们会动态链接和加载。

Maybe I missed something when setting the unit test target?

来自您链接的文章:

Note: The testing target is a separate target. This means that you need to be careful of target membership. All application source files should be added to the application target only. Test code files should be added to the testing target only.

您弄错的部分可能是单元测试包的链接和加载阶段。

关于objective-c - Foo 类在 MyApp 和 MyAppTestCase 中都实现了。将使用两者之一。哪个是未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6149673/

相关文章:

ios - 永久设置 UITableView 内容插入

ios - 在代码生成的 UIView 上绘制 UIBezierPath

objective-c - 请求访问相机胶卷的权限

ios - UITableViewCell 选中行的文字颜色变化

ios - 为什么 UIViewController 在 UINavigationBar 下扩展,而

ios - 检测 iPhone 应用程序中是否存在摄像头?

ios - 每次 Xcode 重新启动时 View 错位

ios - 是否在 iOS SDK 中的任何位置定义了 HTTP 状态代码?

iphone - 重复符号问题

ios - 无法从其 DataSource 获取单元格