0

我已经使用 iPhone SDK 版本 3.1.2 成功为 XCode 版本 3.2.2 项目设置了单元测试。

我创建了一个类“Callout”,我试图在单元测试的上下文中实例化它。该类有一个方法,

-(id) initWithDictionary:(NSDictionary*)calloutDict includesSong:(BOOL)hasSong lastUpdate:(NSDate*)lastUpdate;

我在单元测试中调用它。当我这样做时,我收到错误“无法识别的实例发送到选择器”。这对我来说没有任何意义,所以出于好奇,我将所有内容都保持不变,并将“nil”作为字典参数传入,它构建并运行(当然测试失败,但它仍然运行)。

有人知道这里发生了什么吗?我认为在 OCUnit 中使用自定义数据类型没有任何问题,因为我在单元测试的其他地方成功地做到了。

顺便说一下,这是有问题的代码:

- (void)testCalloutNormal
{ 
 NSDictionary *params = [[NSDictionary alloc] initWithObjects:[NSMutableArray arrayWithObjects:@"sent", 
                  [NSNumber numberWithInt:100], 
                  [NSNumber numberWithInt:50], 
                  @"challengerUsername", 
                  @"challengedUsername", 
                  [NSDate date], 
                  nil] 
               forKeys:[NSMutableArray arrayWithObjects:@"type", 
                  @"challengerScore", 
                  @"challengedScore", 
                  @"challenger", 
                  @"challenged", 
                  @"dateAccepted", 
                  nil]];
 Callout *callout;
 callout = [[Callout alloc] initWithDictionary:params includesSong:NO lastUpdate:[NSDate date]];
 NSInteger ID = 1;
 callout.calloutID = 1;
 [params release];


 STAssertEquals(CalloutOutcomeTypeWon, callout.outcome, @"Failure: challenger's score is higher than the challengee - should return CalloutOutcomeTypeWon");

}

谢谢!

-马特

PS - 我发现的与 OCUnit 相关的大多数线程通常都包含一些据称更好的单元测试框架的建议。我知道它们就在那里,但我并不真正感兴趣,除非你有与 GHUnit 或 Mac 版 Google 工具箱不同的东西。

4

1 回答 1

0

我不能肯定地说,但我怀疑问题出在 OCUnit 上。基于当您为字典参数传递 nil 时错误消失的事实,我猜想有问题的消息是在您的类内某处发送到该字典引用的。当字典引用为 nil 时,它只会吸收消息。

顺便说一句,如果您正在寻找与 OCUnit/GHUnit/GTM 不同的测试框架,我建议您查看Cedar;它是 BDD 风格的测试框架,如 Rspec 或 Jasmine。但是,如前所述,我怀疑测试框架是您的问题。

于 2010-11-07T22:38:44.660 回答