TDD:单元测试异步调用

时间:2013-02-14 05:46:10

标签: ios tdd ocunit

人:

我正在开发一个应用程序,并使用单元测试来构建它。

但是,我现在处于需要测试异步调用的情况。 例如,

- (void)testUserInfoBecomesValidWhenUserIsBuiltSuccessfully
{
    if ( ![userBuilder userInfoUpToDate] )
    {
        [userBuilder buildUser];
    }

    STAssertTrue([userBuilder userInfoUpToDate], @"User information is not valid before building the user");
}

测试此类内容的一般做法是什么? userInfoUpToDate应该异步更新。

谢谢! 威廉

2 个答案:

答案 0 :(得分:4)

有时会尝试使用单元测试来测试通常不会测试的东西。这主要来自误解和测试一切的愿望。然后你意识到你不知道如何用单元测试来测试它。

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

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

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

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

您也可以使用逻辑中的标记对其进行测试。

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

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

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

将你的评论读到另一个答案 - 我认为在测试中使用异步并不常见。例如。肯特贝克在TDD书中。提到并发单元测试是可能的,但非常罕见的情况。

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

答案 1 :(得分:2)

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