2010-09-06 16 views
2

我在创建一个最小化项目以下最低测试用例以下 的GHUnit自述:为什么从单元测试中使用UITableViewCell会导致Trace/BPT陷阱?

#import <GHUnitIOS/GHUnitIOS.h> 
#import <UIKit/UIKit.h> 

@interface MyTest : GHTestCase { } 
@end 

@implementation MyTest 

- (BOOL)shouldRunOnMainThread { 
    return YES; 
} 

- (void)testFoo { 
    UITableViewCell *cell = 
     [[UITableViewCell alloc] initWithStyle:UITableViewStylePlain 
          reuseIdentifier:@"foo"]; 

    NSLog(@"cell: %@", cell); 
    NSLog(@"cell.textLabel: %@", cell.textLabel); 
} 

@end 

它,当我使用生成和运行在在Xcode模拟器运行正常。然而,当我 运行在终端下面的命令:

GHUNIT_CLI=1 xcodebuild -target Tests -configuration Debug -sdk iphonesimulator4.0 build 

我得到这样的输出:

Running: /Users/<user>/Desktop/tmp/TestApp/build/Debug-iphonesimulator/Tests.app/Tests -RegisterForSystemEvents 
Tests(39346) malloc: protecting edges 
Tests(39346) malloc: recording malloc stacks to disk using standard recorder 
Tests(39346) malloc: enabling scribbling to detect mods to free blocks 
Tests(39346) malloc: process 39249 no longer exists, stack logs deleted from /tmp/stack-logs.39249.Tests.ac1JfL.index 
Tests(39346) malloc: stack logs being written into /tmp/stack-logs.39346.Tests.t8LG4p.index 
Test Suite 'Tests' started. 
MyTest/testFoo 2010-09-06 23:24:25.006 Tests[39346:903] cell: <UITableViewCell: 0x5a6d190; frame = (0 0; 320 44); layer = <CALayer: 0x5a6d390>> 
RunTests.sh: line 28: 39346 Trace/BPT trap   $RUN_CMD 
Command /bin/sh failed with exit code 133 
Command /bin/sh failed with exit code 133 
** BUILD FAILED ** 

这种“跟踪/ BPT陷阱”的事情用的OCUnit发生过了,我希望GHUnit 可以解决它,但它不在命令行上。任何人都知道这是什么 ?这似乎与从你不是 应该的上下文中使用UIKit有关,但我不明白限制是什么。

+0

啊,我添加了一些代码,并发现当我在命令行上运行时,[NSApplication sharedApplication]为空;我认为这与此有关。那么是否有一种简单的方法来运行使用UIKit类而不运行模拟器的单元测试? – 2010-09-06 13:57:07

回答

0

在GHUnit中测试UIViews和UIViewControllers时,我从命令行运行时遇到了类似的崩溃,因为没有用于绘制视图的接口。

只要您不调用导致它们自己绘制到屏幕上的方法,您应该能够测试其中一些类中的逻辑。只要未将视图添加到主视图层次结构中,您就可以初始化视图。在UIView和loadView在UIViewController中清除drawRect对我来说是一个帮助。但是,如果您的视图中需要测试的逻辑类型,也许移动逻辑会更容易一些?

4

有许多UIKit类不能在运行UIApplication的上下文之外工作。例如,实例化尝试使用UIFont的任何内容(例如UILabel)会在正在运行的UIApplication外面混乱地爆炸(即分段错误或类似事件)。 UIActivityIndi​​catorView将以相似的方式失败。

确实没有办法持续测试取决于模拟器或设备外部的UIKit的代码。幸运的是,您可以运行为模拟器编译的代码,而无需实际运行模拟器进程。我相信iOS测试的GTM设置会这样做;我知道Cedar这是针对iOS规格的。我并不熟悉GHUnit是否可以做到这一点。

如果你想从命令行运行这样的规格,你需要适当地设置一些环境变量。您需要将DYLD_ROOT_PATH设置为您要链接的iOS SDK的目录,将IPHONE_SIMULATOR_ROOT设置为相同的SDK目录,并将CFFIXED_USER_HOME设置为非空(我使用随机临时目录)。一旦这些设置完成,您可以直接调用它并在命令行中添加-RegisterForSystemEvents,从而执行您针对模拟器SDK构建的二进制文件。

例如,您可以查看Cedar Rakefile(我最熟悉这一点是因为我写了它; GTM或GHUnit中可能存在其他同样有效的示例)。查看它运行的命令行的:uispecs任务中文件的底部。

相关问题