除非添加延迟,否则使用OCMock模拟NSNotificationCenter有时会失败

时间:2014-02-26 19:14:40

标签: cocoa-touch cocoa unit-testing ocmock

如果没有明显引入延迟,模拟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,通知应该是同步传递的,但是我看到它的行为就像它的异步一样。基本上我不想为我的单元测试添加任何故意延迟/睡眠,以确保它们正在通过。有没有什么可以使这些测试始终通过而不添加延迟代码?

1 个答案:

答案 0 :(得分:1)

OCMock与异步进程不兼容。通常不建议在单元测试中使用NSNotificationCenter。相反,你应该创建一个基本的模拟器,并准确控制何时向观察者发送通知。

这并不容易,但如果你真的想要分离你需要测试的代码片段和确定性结果,这是必须的。