OCUnit的问题 - 实例化自定义数据类型

时间:2010-06-29 21:42:08

标签: iphone objective-c unit-testing xcode ocunit

我已成功使用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");

}

谢谢!

-Matt

P.S。 - 我发现与OCUnit相关的大多数线程通常都涉及一些据称更好的单元测试框架的建议。我知道他们在那里,但除非你和GHUnit或Mac工具箱有任何不同,否则我并不感兴趣。

1 个答案:

答案 0 :(得分:0)

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

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