【问题标题】:TDD: Unit Testing Asynchronous CallsTDD:单元测试异步调用
【发布时间】: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 预计会异步更新。

谢谢! 威廉

【问题讨论】:

    标签: ios tdd ocunit


    【解决方案1】:

    有时会很想测试一些您通常不会使用单元测试进行测试的东西。这基本上来自误解和测试一切的愿望。然后你意识到你不知道如何用单元测试来测试它。

    你最好问问自己 - 我在这里测试什么?

    我是否测试在请求完成之前数据不可用?

    然后您可以编写非异步版本的测试,它将在请求完成后检查数据是否可用。

    我是否在请求后测试响应是否正确保存?

    您还可以在逻辑中使用标志对其进行测试。

    您可以在不运行异步测试的情况下进行所有逻辑测试。

    所以在底部我什至会问你为什么你认为你需要测试异步调用?

    单元测试应该可以快速运行 - 所以将其视为不测试异步调用的另一个原因。想象一下运行这些测试的持续集成系统 - 它需要额外的时间。

    并阅读您的 cmets 到另一个答案 - 我认为在测试中使用异步并不常见。例如。 TDD 书中的 Kent Beck。提到并发单元测试是可能的,但非常罕见。

    那么 - 你真的想测试什么以及为什么?

    【讨论】:

    • 啊,我带着同样的问题来到这里,但你现在让我想到了一个替代方案。
    • @Fogmeister 谢谢!是的 - 我们有时真的应该深入思考我们真正想要什么。
    • 那么,如何测试请求后响应是否正确保存?
    【解决方案2】:

    使用运行循环,轮询直到完成或达到超时: https://codely.wordpress.com/2013/01/16/unit-testing-asynchronous-tasks-in-objective-c/

    【讨论】:

    • 单元测试框架支持这一点是否普遍?例如,XCode 中的 OCTest?我的意思是,即使你等待,如果测试只在一个线程中运行,而其他线程被阻塞怎么办?
    • GHUnit 是一个单元测试框架的示例,它内置了对异步调用的支持,但底层机制与我在链接中提供的基本相同:轮询重新同步。
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2017-06-01
    • 2023-03-05
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多