【发布时间】:2012-03-16 13:39:41
【问题描述】:
这是我的具体情况。
我有一个 QueryQueue 类,它在 ArcGIS API for Flex 中包装了 QueryTask 类。这使我能够轻松地将多个查询任务排队等待执行。调用QueryQueue.execute() 遍历我队列中的所有任务并调用它们的执行方法。
收到并处理完所有结果后,QueryQueue 将调度完成的事件。我的类的接口非常简单。
public interface IQueryQueue
{
function get inProgress():Boolean;
function get count():int;
function get completed():ISignal;
function get canceled():ISignal;
function add(query:Query, url:String, token:Object = null):void;
function cancel():void;
function execute():void;
}
要使QueryQueue.execute 方法被认为是成功的,必须发生几件事。
-
task.execute必须在每个查询任务上调用一次且只能调用一次 -
inProgress = true结果待定 -
inProgress = false当结果处理完毕时 -
completed在结果处理完毕后发送 -
canceled永远不会被调用 - 在队列中完成的处理正确地处理和打包查询结果
我正在努力将这些测试分解为可读、合乎逻辑和可维护的测试。
逻辑上我正在测试一个状态,即成功执行状态。这表明将断言 #1 到 #6 上面的一个单元测试是正确的。
[Test] public mustReturnQueryQueueEventArgsWithResultsAndNoErrorsWhenAllQueriesAreSuccessful:void
但是,测试的名称并不提供信息,因为它没有描述所有必须为真才能被视为通过测试的事情。
在线阅读(包括here 和programmers.stackexchange.com)有一个相当大的阵营断言单元测试应该只有一个断言(作为指导)。因此,当测试失败时,您可以确切地知道失败的原因(即 inProgress 未设置为 true、已完成显示多次等)。您最终可能会遇到更多(但理论上更简单、更清晰)的测试,如下所示:
[Test] public mustInvokeExecuteForEachQueryTaskWhenQueueIsNotEmpty():void
[Test] public mustBeInProgressWhenResultsArePending():void
[Test] public mustNotInProgressWhenResultsAreProcessedAndSent:void
[Test] public mustDispatchTheCompletedEventWhenAllResultsProcessed():void
[Test] public mustNeverDispatchTheCanceledEventWhenNotCanceled():void
[Test] public mustReturnQueryQueueEventArgsWithResultsAndNoErrorsWhenAllQueriesAreSuccessful:void
// ... and so on
这可能会导致测试中出现大量重复代码,但可以通过适当的 setup 和 teardown 方法将其最小化。
虽然这个问题与其他问题相似,但我正在寻找这个特定场景的答案,因为我认为它很好地代表了一个复杂的单元测试场景,展示了需要验证的多种状态和行为。不幸的是,许多其他问题都没有示例,或者示例没有展示复杂的状态和行为。
【问题讨论】:
-
每个单元测试应该只有一个断言的想法是impractical and short sighted。
标签: actionscript-3 unit-testing apache-flex flex4.5 flexunit4