TDD:单元测试异步调用
Posted
技术标签:
【中文标题】TDD:单元测试异步调用【英文标题】:TDD: Unit Testing Asynchronous Calls 【发布时间】:2013-02-14 05:46:09 【问题描述】:各位:
我正在开发一个应用程序,并通过单元测试来构建它。
但是,我现在需要测试异步调用。 例如,
- (void)testUserInfoBecomesValidWhenUserIsBuiltSuccessfully
if ( ![userBuilder userInfoUpToDate] )
[userBuilder buildUser];
STAssertTrue([userBuilder userInfoUpToDate], @"User information is not valid before building the user");
测试这些东西的一般做法是什么? userInfoUpToDate 预计会异步更新。
谢谢! 威廉
【问题讨论】:
【参考方案1】:有时会很想测试一些您通常不会使用单元测试进行测试的东西。这基本上来自误解和测试一切的愿望。然后你意识到你不知道如何用单元测试来测试它。
你最好问问自己 - 我在这里测试什么?
我是否测试在请求完成之前数据不可用?
然后您可以编写非异步版本的测试,它将在请求完成后检查数据是否可用。
我是否在请求后测试响应是否正确保存?
您还可以在逻辑中使用标志对其进行测试。
您可以在不运行异步测试的情况下进行所有逻辑测试。
所以在底部我什至会问你为什么你认为你需要测试异步调用?
单元测试应该可以快速运行 - 所以将其视为不测试异步调用的另一个原因。想象一下运行这些测试的持续集成系统 - 它需要额外的时间。
并阅读您的 cmets 到另一个答案 - 我认为在测试中使用异步并不常见。例如。 TDD 书中的 Kent Beck。提到并发单元测试是可能的,但非常罕见。
那么 - 你真的想测试什么以及为什么?
【讨论】:
啊,我带着同样的问题来到这里,但你现在让我想到了一个替代方案。 @Fogmeister 谢谢!是的 - 我们有时真的应该深入思考我们真正想要什么。 那么,如何测试请求后响应是否正确保存?【参考方案2】:使用运行循环,轮询直到完成或达到超时: https://codely.wordpress.com/2013/01/16/unit-testing-asynchronous-tasks-in-objective-c/
【讨论】:
单元测试框架支持这一点是否普遍?例如,XCode 中的 OCTest?我的意思是,即使你等待,如果测试只在一个线程中运行,而其他线程被阻塞怎么办? GHUnit 是一个单元测试框架的示例,它内置了对异步调用的支持,但底层机制与我在链接中提供的基本相同:轮询重新同步。以上是关于TDD:单元测试异步调用的主要内容,如果未能解决你的问题,请参考以下文章