Chr*_*Rea 8 xcode unit-testing linker-errors command-line-tool xcode4.5
无法为特定方案设置单元测试.这是我正在尝试的:
在Xcode 4.5中,我创建了一个简单的OSX "命令行工具"应用程序项目(Foundation).
请注意,Xcode 不提供自动将单元测试添加到"命令行工具"项目的选项 - 所以请不要建议勾选方框.它不存在: - /
在我的项目中,我创建了一个我想测试的简单示例类; 例如"形状".
我跟着苹果的指示Xcode的单元测试指南用于在项目设置的单元测试:
我在我的项目中添加了一个单元测试目标,并且
我编辑了"测试"方案以在新目标中运行测试.
在测试项目的实现(.m)文件中,我Shape.h在setUp()方法中添加了一个import 和code 来实例化一个形状并将其分配给一个实例变量.
那时,我决定看看是否会构建一些东西,以及默认测试是否仍会运行.但是,当我从菜单中选择Product ... Test时,构建失败并出现以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
解释此错误不是问题.我知道单元测试目标没有链接到包含Shape实现的二进制文件.但是,我还没有(还)了解Xcode单元测试和目标配置.所以:
为了使测试目标链接到命令行工具的结果输出,我需要做什么?我可以链接到单元测试目标的命令行可执行文件吗?Apple的文档看起来特定于常规OSX应用程序(*.app)和iOS应用程序,而这两者都不是.
我有业务逻辑类,我想在命令行工具设置(开始)中开发,所以我想了解我需要做什么才能在"命令行工具"中运行单元测试目标"项目类型. 谢谢!
(PS请注意,我不感兴趣,我的运行单元测试从命令行-堆栈溢出已经建议对如何做到这一点"相似"的问题-而是运行单元测试上一个"命令行工具"类型的项目,而且还来自Xcode内部.)
Chr*_*Rea 13
我已经确定了一个我认为合适的解决方法,除了增加的目标之外,它似乎没有明显的缺点.
简而言之:该解决方案涉及添加静态库目标,以利用Xcode创建和运行围绕此类目标的单元测试代码的能力.然后命令行工具目标委托给静态库,其中main()定义了类似替代的函数并由实际main()入口点调用.命令行工具不受任何重要代码的影响,因此单元测试目标可以访问值得测试的所有内容.
以下是步骤:
从空的Xcode,从菜单中选择File ... New Project.
在结果对话框中,选择OS X ...应用程序...命令行工具.出于本示例的目的,我假设它名为SampleCmd.
创建基本命令行工具项目后:
从菜单中选择File ... New ... Target.
在结果对话框中,选择OS X ... Framework&Library ... Cocoa Library.出于本示例的目的,我假设它名为SampleCmdLogic.
选择类型静态,因此命令行工具将保持独立的可执行文件.
确保选中" 包括单元测试"框.
创建静态库项目后:
将main()函数复制main.m到SampleCmdLogic.m,替换@implementation块.(此文件仅包含主入口点.可以为Objective-C类添加其他文件等.) 将函数重命名为libMain().
在SampleCmdLogic.h,添加一个新的声明libMain(),替换@interface块:
int libMain(int argc, const char * argv[]);
在命令行工具中main.m,添加一个#import "SampleCmdLogic.h"顶部.
在命令行工具中main.m,将实际main()函数的全部内容更改为:
return libMain(argc, argv);
代码现已准备就绪,但需要链接步骤:
在项目设置中SampleCmd,在Build Phases下,展开Target Dependencies并添加(+)SampleCmdLogic作为依赖项.
在项目设置中SampleCmd,在Build Phases下,展开Link Binary With Libraries并添加(+)libSampleCmdLogic.a
一切都准备好了.当您更改为SampleCmd目标并从菜单中选择Product..Run时,构建应该成功并按预期生成输出.当您更改为SampleCmdLogic目标并从菜单中选择Product ... Test时,构建应该成功并且单元测试将运行.报告的单个问题将是Xcode插入的初始默认失败单元测试断言SampleCmdLogicTests.m.这是预料之中的.
从这一点开始,继续将所有逻辑和相应的测试添加到SampleCmdLogic目标.SampleCmd目标仍然是微不足道的,只提供命令行工具入口点.
| 归档时间: |
|
| 查看次数: |
3387 次 |
| 最近记录: |