2

睡觉/等到某些通知发布的最佳方法是什么?

我有一个带有异步 API 的类,可以从中获取数据NSNotification(通知来自 Cocoa,我无法避免),我需要对其进行单元测试。

到目前为止,我已经弄清楚了半忙等待:

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]]

如果不处理运行循环通知,则不会收到。但是,当需要的通知到来时,我怎样才能立即从运行循环中中断呢?

4

2 回答 2

2

runMode:beforeDate: 将只运行一次循环,因此您可以在循环中使用该调用,直到您检测到通知已被处理(如果没有别的,您的处理程序可以将测试类中的成员变量翻转为 YES)。

于 2009-07-27T23:40:37.373 回答
1

如果这只是对您的代码对通知的反应进行单元测试,我认为导致线程休眠可能是矫枉过正。想到几个问题...

  1. 您将如何测试通知响应是通过还是失败 - 您可以测试任何可衡量的副作用吗?
  2. 您可以发送自己的 NSNotification 来衡量响应吗?(您提到 NSRunLoop 通常会处理它,但如果您可以模拟通知,测试将更加可预测。)
  3. 如果(出于某种原因)您正在尝试测试通知是否已发送,是否需要?(如果它是自动的,请不要打扰——如果它是用户生成的,单元测试可能会很困难,但模拟它可以简化事情。)

如果你真的需要创建一个多线程的场景来测试,你可以看看这个单元测试代码testLockUnlock的例子。(我只是想确保我的代码正确地使用了内置于集合或通用可变对象中的锁。)

于 2009-07-27T23:01:23.693 回答