如何在Xcode 4.5"命令行工具"项目中设置工作逻辑单元测试目标?

Chr*_*Rea 8 xcode unit-testing linker-errors command-line-tool xcode4.5

无法为特定方案设置单元测试.这是我正在尝试的:

  • 在Xcode 4.5中,我创建了一个简单的OSX "命令行工具"应用程序项目(Foundation).
    请注意,Xcode 提供自动将单元测试添加到"命令行工具"项目的选项 - 所以请不要建议勾选方框.它不存在: - /

  • 在我的项目中,我创建了一个我想测试的简单示例类; 例如"形状".

  • 我跟着苹果的指示Xcode的单元测试指南用于在项目设置的单元测试:

    • 我在我的项目中添加了一个单元测试目标,并且

    • 我编辑了"测试"方案以在新目标中运行测试.

  • 在测试项目的实现(.m)文件中,我Shape.hsetUp()方法中添加了一个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.mSampleCmdLogic.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目标仍然是微不足道的,只提供命令行工具入口点.

  • @JonReid欢迎你.谢谢你的帮助. (2认同)