如何在命令行 GHUnit 中使用 UIApplicationDelegate?

Posted

技术标签:

【中文标题】如何在命令行 GHUnit 中使用 UIApplicationDelegate?【英文标题】:How can I use UIApplicationDelegate in command line GHUnit? 【发布时间】:2011-06-25 19:05:18 【问题描述】:

我对从模拟器运行和从命令行运行的 GHUnit 结果存在差异。 如何在 cli 中使用 UIApplicationDelegate?

在我的sample app - tags ***-6479906 中。 我想将苹果的 OCUnit 示例转移到 GHUnit 一个。

预期:

两个“appDelegate”都不为零。

当前:

从模拟器运行正常。但是从 cli 运行会引发异常。https://gist.github.com/1046753

参考:apple's unittest example

注意:我阅读了异步 NSURLConnection 示例,但在我的 UIApplicationDelegate 案例中没有找到解决方案和调整。

【问题讨论】:

【参考方案1】:

我建议您为您的应用委托设计测试用例,以便它实例化它的一个实例并从那里调用方法和测试输出。

考虑如下结构:

@interface  FizzBuzzObjCStudyTest : GHTestCase 
   ObjCStudyAppDelegate *appDelegate;

@end

@implementation FizzBuzzObjCStudyTest
-(void)setUp

   appDelegate = [[ObjCStudyAppDelegate alloc] init];


-(void)tearDown

   [appDelegate release];


-(void) testAppDelegate

   GHAssertNotNil(appDelegate, @"Cannot find the application delegate", nil);

   // test other methods of ObjCStudyAppDelegate here, or make more test methods.

@end

GHUnit 框架绕过了在 CLI 版本中创建 UIApplicationDelegate 的 UI 框架。事实上,GUI 版本的 GHUnit 实际上是在实例化自己的 UIApplicationDelegate,称为 GHUnitIPhoneAppDelegate。

这是来自 GHUnitiosMain.m 的 sn-p,展示了它如何为 GUI 版本设置自己的应用程序委托:

// If GHUNIT_CLI is set we are using the command line interface and run the tests
// Otherwise load the GUI app
if (getenv("GHUNIT_CLI")) 
    retVal = [GHTestRunner run];
 else 
    retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");

【讨论】:

这会使测试变为绿色。伟大的!但我觉得 CLI 和 GUI 之间存在一些差异。我不在 CLI 版本中使用 UIApplication?我可以用 OCUnit 做到这一点。 GHUnit 似乎需要自己的应用程序委托类来运行它呈现的 GUI。我编辑了答案以包含来自 GHUnitIOSMain.m 的 sn-p。所以 GUI 版本不会像 OCUnit 那样隐式创建您的应用程序委托。

以上是关于如何在命令行 GHUnit 中使用 UIApplicationDelegate?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GHUnit 测试委托回调

GHUnit,OCMock:如何测试两个指定块之一是不是被调用?

如何为委托方法编写 GHunit 测试用例?

xcode 中的单元测试(使用 GHUnit 和 OCMock)

GHUnit 在 iOS 项目中转换为 ARC 后给出 allocate_pages() 错误

GHUnit 跳转到代码中的错误