无法为特定场景设置单元测试。这就是我正在尝试的:
在 Xcode 4.5 中,我创建了一个简单的 OSX“命令行工具”应用项目(基金会)。
请注意,Xcodedoes not提供自动将单元测试添加到“命令行工具”项目的选项 - 所以请不要建议勾选复选框;它不在那里:-/
在我的项目中,我创建了一个简单的示例类,我想测试它;例如“形状”。
-
我按照苹果的说明进行操作Xcode 单元测试指南 for 在项目中设置单元测试 http://developer.apple.com/library/mac/#documentation/developertools/Conceptual/UnitTesting/02-Setting_Up_Unit_Tests_in_a_Project/setting_up.html:
我向我的项目添加了一个单元测试目标,并且
我编辑了“测试”方案以在新目标中运行测试。
在测试项目的实现 (.m) 文件中,我添加了一个导入Shape.h
和代码在setUp()
方法实例化形状并将其分配给实例变量。
那时,我决定看看事情是否会构建以及默认测试是否仍然会运行。然而当我选择产品...测试从菜单中,构建失败并出现以下错误:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_Shape", referenced from:
objc-class-ref in ExampleTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解释这个错误不是问题。我发现单元测试目标没有链接到包含 Shape 实现的二进制文件。但是,我(还)没有理解 Xcode 单元测试和目标配置。所以:
为了让测试目标链接到命令行工具的结果输出,我需要做什么?我可以从单元测试目标链接到命令行可执行文件吗? Apple 的文档看起来特定于常规 OSX 应用程序(*.app
)和 iOS 应用程序,而这两者都不是。
我有业务逻辑类,我想在命令行工具设置中开发(首先),所以我想了解我需要做什么才能让单元测试目标在“命令行工具”中运行” 项目类型。谢谢你!
(注:请注意,我是not有兴趣运行我的单元测试from命令行 – Stack Overflow 已经提出了关于如何做到这一点的“类似”问题 – 而是运行单元测试on“命令行工具”类型project,并且仍然是在 Xcode 中。)
我已经确定了一个我认为合适的解决方法,除了添加目标之外,它似乎没有明显的缺点。
简而言之:解决方案包括添加静态库目标利用 Xcode 围绕此类目标创建和运行单元测试代码的能力。然后,命令行工具目标委托给静态库,其中有一个备用工具main()
类函数由实数定义和调用main()
入口点。命令行工具不含重要代码,因此单元测试目标可以访问所有值得测试的内容。
步骤如下:
创建基本命令行工具项目后:
创建静态库项目后:
复制main()
函数来自main.m
to SampleCmdLogic.m
,替换@implementation
堵塞。 (此文件仅保存主入口点。可以为 Objective-C 类等添加其他文件。)Rename该函数为libMain()
.
In SampleCmdLogic.h
,添加新的声明libMain()
,替换@interface
block:
int libMain(int argc, const char * argv[]);
在命令行工具中main.m
,添加一个#import "SampleCmdLogic.h"
at top.
在命令行工具中main.m
,改变真实的全部内容main()
函数:
return libMain(argc, argv);
代码现已准备就绪,但需要执行链接步骤:
在项目设置中SampleCmd
, under 构建阶段, 扩张目标依赖关系并添加 (+) SampleCmdLogic 作为依赖项。
在项目设置中SampleCmd
, under 构建阶段, 扩张将二进制文件与库链接并添加 (+)libSampleCmdLogic.a
现在一切都准备好了。当您更改为 SampleCmd 目标并选择产品..运行从菜单中,构建应该成功并按预期生成输出。当您更改为 SampleCmdLogic 目标并选择产品...测试从菜单中,构建应该成功并且单元测试将运行。报告的单个问题将是 Xcode 插入的初始默认失败单元测试断言,在SampleCmdLogicTests.m
。这是预料之中的。
从现在开始,继续将所有逻辑和相应的测试添加到 SampleCmdLogic 目标中。 SampleCmd 目标保持简单,仅提供命令行工具入口点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)