单元测试功能,调用外部异步API

时间:2014-07-08 08:20:46

标签: actionscript-3 unit-testing asynchronous tdd

我真的想要掌握TDD方法并将其整合到我的编码行为中,但我真的很难理解人们如何测试一些复杂的案例。例如,考虑这种情况:我有一个由等级组成的游戏。当用户通过关卡时,我应该显示一个对话框,告诉他他在朋友中的当前位置。该对话框只能显示3个位置,其中当前用户应该具有最高的位置和分数。如果用户少于2个朋友,我必须在此对话框中显示“假”朋友。

所以,我有一个函数,它接收一个对象向量,包含用户的UID(通过它们在某个社交网络中表示)以及它们在给定级别的排行榜中的分数和位置。该功能应该在游戏关卡结束后调用,它应该在对话框(视图)中以正确的顺序封送那些用户,根据它们的位置,分数等以正确的顺序显示用户。所以这个函数在伪代码中看起来像这样:

public function marshallUsers(users:Vector.<User>):void {
  // Add necessary fake users, if the vector length less than 3

  // Compute social network request for users's photos
  // basically it just a string with comma-separated user ids

  // Enquiry social network API asynchronously, calling callback
  // function when the request succeeds. This is singleton.
}

private function callback(users:Array):void
{
    // fill the user portraits in the dialog
}

那么如何提取我应该在marshallUsers函数中测试的内容呢?内部对象状态改变?如何测试不仅依赖于外部全局对象的函数,而且在异步调用成功后在逻辑上继续?我怎么能避免这种情况?

1 个答案:

答案 0 :(得分:1)

如果您的案件“太复杂”,通常是因为它过于宽泛。

根据你的描述,marshallUsers似乎并没有在内部执行太多逻辑(除了可能添加假朋友?)。它只是调用一系列其他对象?如果是这样,那么没有太多要测试。您应该测试marshallUsers在自己的测试中调用的各个组件。

您可以测试的是marshallUsers是否正确处理了它使用的每个组件的各种输出状态(例如一组有效的用户,少于3个用户,无法获得响应等)。您可以模拟各种组件来提供这些虚拟响应。

请记住,理想情况下,您只需在marshallUsers内测试逻辑,其他所有内容都应与其隔离。

对于它的价值,在我们针对您的类似案例进行的测试中,我们首先按照我的描述进行测试,但通常还会进行至少一次“端到端”测试,该测试仅调用API确保它们正确地组合在一起。这个论点当然是经过深思熟虑的测试你不应该 - 但现实世界并不总是经过深思熟虑。