如果没有明显引入延迟,模拟NSNotificationCenter有时可能会失败。我创建了一个简单的测试项目,我在其中添加了一个测试通知的测试
id mock = [OCMockObject observerMock];
[[NSNotificationCenter defaultCenter] addMockObserver:mock name:kMyNotification object:nil];
[[mock expect] notificationWithName:kMyNotification object:[OCMArg any] userInfo:[OCMArg any]];
MyCoolClass *cool = [MyCoolClass new];
[cool methodthatPostsANotification];
//[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
[mock verify];
[[NSNotificationCenter defaultCenter] removeObserver:mock];
基本上,测试会定期失败,除非注释掉runloop行没有注释。但是,如果该行被取消注释,它总是会像我期望的那样成功。根据apple docs,通知应该是同步传递的,但是我看到它的行为就像它的异步一样。基本上我不想为我的单元测试添加任何故意延迟/睡眠,以确保它们正在通过。有没有什么可以使这些测试始终通过而不添加延迟代码?
答案 0 :(得分:1)
OCMock与异步进程不兼容。通常不建议在单元测试中使用NSNotificationCenter。相反,你应该创建一个基本的模拟器,并准确控制何时向观察者发送通知。
这并不容易,但如果你真的想要分离你需要测试的代码片段和确定性结果,这是必须的。