对NNimer发送的NSNotification的单元测试

时间:2015-10-21 10:19:42

标签: objective-c unit-testing asynchronous nstimer nsnotification

几天后,我试图找出如何使用GHUnit测试我的API。现在我来解决这个问题:

API获得了一些输入,CUT做了一些事情并启动了NSTimer。定时器触发后,它会发送带有一些userInfo数据的NSNotification。很清楚如何测试userInfo数据,但我想测试的是,如果通知仅在某些特定情况下发送时才发送,如果没有,则根本不应该发送。

我如何测试它,在阅读之后非常清楚:http://www.hpique.com/2013/12/nsnotificationcenter-part-3/

但现在逻辑问题出现了:CUT的异步行为在NSTimer触发后发送NSNotification。当我在每次测试中等待计时器发射时,我的测试将变得非常缓慢。

如何在不等待NSTimer触发的情况下测试行为?你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不知道在Xcode中使用XCTest执行同步测试的方法。当然,您可以定义多个测试项目并从控制台同时运行它们。但我猜,这不是你想要的。

异步测试要求测试方法在测试断言之前返回,但最终将 进行测试。测试运行器需要了解异步测试才能正确处理它们。

使用XCTest,无法进行异步测试。源代码文档中有一些提示让我相信,这可能根本不可能:

waitForExpectationsWithTimeout的说明中,它指出:

" -waitForExpectationsWithTimeout:handler:在测试流程中创建一个同步点。只有一个-waitForExpectationsWithTimeout:handler:可以在任何给定时间激活,但多个离散序列{expected - > wait}可以链接在一起。"

" waitForExpectationsWithTimeout在处理事件时运行运行循环,直到满足所有期望或达到超时。使用此API时,客户端不应操纵运行循环。"

因此,只有一个 waitForExpectationsWithTimeout:handler:可以处于活动状态,我们不能修改基础运行循环 - 这非常清楚地表明我们无法异步执行测试

  

注意:您可以在测试方法中测试异步方法或函数。但是,在XCTest中,测试方法本身始终是同步 - 因为它等待以使结果可用。