【发布时间】:2011-06-01 17:47:45
【问题描述】:
我在测试一些使用通知的逻辑时遇到了困难。我读过关于 enforcing that particular NSNotifications are sent 的文章,但这并不能真正解决我所看到的问题。
[SomeObject PerformAsyncOperation] 创建一个NSURLRequest 并将自己设置为响应委托。根据响应的内容,SomeObject 将成功或失败NSNotification 发布到默认的NSNotificationCenter。
我的测试的问题是在调用PerformAsyncOperation 之后,测试并没有等待响应被发送。相反,它继续断言 - 失败,因为请求/响应没有时间发送/接收/解析。
代码如下:
-(void)testMethod {
SomeObject *x = [[SomeObject alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(success:)
name:SomeObjectSuccess
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(failure:)
name:SomeObjectFailure
object:nil];
operationCompleted = false; // declared in .h
[x PerformAsyncOperation:@"parameter"];
STAssertTrue(operationCompleted , @"Operation has completed.");
[[NSNotificationCenter defaultCenter] removeObserver:self name:SomeObjectSuccess object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:SomeObjectFailure object:nil];
[x release];
}
-(void) failure:(NSNotification *) notification {
operationCompleted = true;
NSLog(@"Received failure message.");
}
-(void) success:(NSNotification *) notification {
operationCompleted = true;
NSLog(@"Received success message.");
}
我尝试在调用PerformAsyncOperation 之后休眠线程,以及一个空的while (!operationCompleted) 循环。两者都不起作用 - 休眠线程仍然使断言失败,并且 while 循环永远不会退出。我也尝试将断言移动到success: 和failure:,但是因为OCUnit 期望每个方法都是测试方法,所以它立即执行所有三个方法并退出(不等待NSURLRequest 的响应,这就是练习的重点!)。
任何想法或见解将不胜感激。谢谢!
【问题讨论】:
标签: xcode unit-testing ios4 ocunit observer-pattern