首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候需要在测试目标中包括应用程序源?

什么时候需要在测试目标中包括应用程序源?
EN

Stack Overflow用户
提问于 2014-02-20 14:46:13
回答 6查看 24K关注 0票数 72

在一个新项目中,我有一个简单的测试

代码语言:javascript
运行
复制
#import <XCTest/XCTest.h>
#import "ViewController.h"

@interface ViewControllerTests : XCTestCase
@end

@implementation ViewControllerTests

- (void)testExample
{ 
    // Using a class that is not in the test target.
    ViewController * viewController = [[ViewController alloc] init];
    XCTAssertNotNil(viewController, @"");
}

@end

H是,不是测试目标的,但它编译和运行测试时没有问题。

我认为这是因为应用程序是首先构建的(作为依赖关系),然后是测试。然后,链接器会计算出ViewController类是什么。

但是,在具有完全相同的测试和ViewController文件的旧项目上,构建在链接器阶段失败:

架构的未定义符号i386:"_OBJC_CLASS_$_ViewController",引用自: objc-class-ref中的ViewControllerTests.o

即使创建了新的XCTest单元测试目标,也会发生链接器错误。

为了避免这种情况,可以在应用程序和测试目标中都包括源(在上面的图像中勾选两个框)。这将导致在模拟器的系统日志中为重复符号生成警告(打开模拟器并按cmd-/查看此):

类ViewController是在./iPhone模拟器/. /MyApp.app/MyApp和ViewController中实现的。两个中的一个将被使用。哪个是未定的。

这些警告偶尔会引发以下示例所说明的问题:

代码语言:javascript
运行
复制
 [viewController isKindOfClass:[ViewController class]]; // = NO
 // Memory address of the `Class` objects are different.

 NSString * instanceClassString = NSStringFromClass([viewController class]);
 NSString * classString         = NSStringFromClass([ViewController class]);

 [instanceClassString isEqualToString:classString]; // = YES
 // The actual class names are identical

所以问题是,旧项目中的哪些设置要求在测试目标中包含应用程序源文件?

评论摘要

在工作项目和非工作项目之间:

  1. 链接器输出没有区别(以Ld开头的命令)。
  2. 目标依赖关系没有差异(测试目标有一个依赖项,即应用程序)
  3. 链接器设置没有区别。
EN

Stack Overflow用户

发布于 2014-02-26 23:53:55

我也遇到了这个问题,并遵循了jackslash的建议,但还有一个补充:选择您的主要目标并在默认情况下查找隐藏的符号(在AppleLVM5.0-代码生成下),如果值为Yes,则将其更改为No。这似乎“隐藏”了单元测试目标正在寻找的编译源的所有符号。为我工作。请确保你包括所有的步骤,斜杠以及概述。

票数 18
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21911168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档