我已成功使用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工具箱有任何不同,否则我并不感兴趣。
答案 0 :(得分:0)
我不能肯定地说,但我怀疑问题出在OCUnit上。基于当你为字典参数传递nil时错误消失的事实,我猜想有问题的消息会在你的类中的某个地方发送到该字典引用。当字典引用为零时,它只是吸收消息。
顺便提一下,如果您正在寻找与OCUnit / GHUnit / GTM不同的测试框架,我建议您查看Cedar;它是BDD风格的测试框架,如Rspec或Jasmine。但是,如上所述,我怀疑测试框架是你的问题。