这是我的具体情况。
我有一个将类QueryQueue
包装QueryTask
在 ArcGIS API for Flex 中的类。这使我能够轻松地将多个查询任务排队等待执行。调用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
但是,测试的名称并不提供信息,因为它没有描述所有必须为真才能被视为通过测试的事情。
在线阅读(包括在这里和在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
方法将其最小化。
虽然这个问题与其他问题相似,但我正在寻找这个特定场景的答案,因为我认为它很好地代表了一个复杂的单元测试场景,展示了需要验证的多个状态和行为。不幸的是,许多其他问题没有示例,或者示例没有展示复杂的状态和行为。