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:单元测试异步调用的主要内容,如果未能解决你的问题,请参考以下文章

使单元测试等待另一个方法中的异步调用

异步服务调用的 TableView 单元测试

如何在单元测试之前等待组件的挂载回调中的异步调用完成?

单元测试在C#,Moq中调用SAP异步Web服务

如何防止在 dart 中使用 expectAsync 的单元测试进展?

如何测试使用 setTimeout 调用另一个操作的异步操作创建者