Cocoa Xcode 3.1.3问题单元测试插件
继ChrisHanson和Apple的博客之后,我开始为我的项目实施单元测试。然而,我使用了很多插件(可加载的捆绑包),我不知道如何测试它们Cocoa Xcode 3.1.3问题单元测试插件,cocoa,unit-testing,xcode,Cocoa,Unit Testing,Xcode,继ChrisHanson和Apple的博客之后,我开始为我的项目实施单元测试。然而,我使用了很多插件(可加载的捆绑包),我不知道如何测试它们 我想我会使用Chris Hanson描述的测试框架的方法。 我从一个Cocoa Bundle项目开始,添加了一个principal类,并将类型更改为plugin。 然后我添加了单元测试包,将插件添加为直接依赖项(苹果的说明),并设置以下构建设置: 捆绑加载程序:$(内置产品目录)/CocoaPlugin.plugin/Contents/MacOS/Coco
我想我会使用Chris Hanson描述的测试框架的方法。 我从一个Cocoa Bundle项目开始,添加了一个principal类,并将类型更改为plugin。
然后我添加了单元测试包,将插件添加为直接依赖项(苹果的说明),并设置以下构建设置:
捆绑加载程序:$(内置产品目录)/CocoaPlugin.plugin/Contents/MacOS/CocoaPlugin
测试主机:$(BUNDLE\u LOADER)
问题是,一旦我完成了这项工作并构建了测试目标,我就会收到以下消息: 错误:测试主机“/Users/elisevanlooij/Documents/plugins/CocoaPlugin/build/debugcoaplugin.plugin/Contents/MacOS/CocoaPlugin”异常退出,代码127(可能已崩溃)。[另一个插件中的代码126]
我曾希望添加otest自定义可执行文件会有所帮助,但不幸的是没有。我真的希望有人能帮助我,因为无法对我的插件进行单元测试,这真的会让我的测试生活陷入困境。退一步。您的包加载程序设置错误,添加自定义可执行文件不会影响单元测试包的编译 您需要让您的单元测试包在没有错误(和警告!)的情况下进行构建,并且您的测试将自动运行(您至少有一个有效的SenTestCase类和至少一个有效的测试方法,对吗?) 所以, 您是说您的测试包编译时没有警告,并且您已经使用插件中的类和方法编写了一些测试?如果是这样的话,您必须知道如何将插件包加载到单元测试包中并定义某种API,因为插件包没有任何公共头,对吗 将插件加载到插件中(基本上是您正在尝试做的事情)并不容易,而且它们在编译时不会像您提到的Chris Hanson博客中的框架那样神奇地“链接”。如果它们是插件,它们就不会是插件 最简单的方法是根本不测试插件,而是将要测试的文件直接添加到单元测试包中。至少通过这种方式,您可以继续测试代码,而不必费劲地动态加载捆绑包 但是,如果这不令人满意,您可以通过一点努力来完成您正在尝试的工作-您肯定应该添加测试来验证您的插件是否已加载,以及您认为可用的符号是否确实可用。一旦您的测试构建正常,您应该关注Chris Hanson的另一篇优秀博客,该博客向您展示了如何在调试器中单步执行测试,您应该能够跟踪任何错误
- 不要设置TEST_主机,从测试包中加载插件。例如,您可以使用initlaize方法来实现这一点
- 创建一个虚拟的测试主机应用程序来加载你的插件,然后调用NSApplicationMain,并将此应用程序用作你的测试主机
+initalize
方法如下所示:
+ (void)initialize
{
NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
[bundle load];
NSLog(@"Loaded:%@\n",bundle);
}
int main(int argc,const char** argv)
{
NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
[bundle load];
NSLog(@"Loaded:%@\n",bundle);
return NSApplicationMain(argc,argv);
}
虚拟测试主机应用程序中的主要方法如下所示:
+ (void)initialize
{
NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
[bundle load];
NSLog(@"Loaded:%@\n",bundle);
}
int main(int argc,const char** argv)
{
NSBundle* bundle = [NSBundle bundleWithPath:pathToPlugin];
[bundle load];
NSLog(@"Loaded:%@\n",bundle);
return NSApplicationMain(argc,argv);
}
测试插件的其他想法:
- 使用独立的bundle:不要指定bundle\u LOADER或TEST\u HOST,也不要将插件中的类放入unittest bundle中
- 将您的测试用例放入插件,并尝试获取unittest。只需在插件中添加一个脚本阶段:
TEST\u RIG=/Developer/Tools/otest“${SYSTEM\u Developer\u DIR}/Tools/RunUnitTests”