这是我的具体场景。
我有课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;
}
For the QueryQueue.execute
方法要被认为成功必须满足几件事情。
-
task.execute
每个查询任务必须且仅调用一次
-
inProgress = true
在结果待定期间
-
inProgress = false
当结果被处理时
-
completed
处理结果后调度
-
canceled
从未被调用过
- 队列内完成的处理正确处理并打包查询结果
我正在努力将这些测试分解为可读的、逻辑的和可维护的测试。
从逻辑上讲我正在测试一个state,即执行成功状态。这表明一个单元测试将断言上面#1 到#6 为真。
[Test] public mustReturnQueryQueueEventArgsWithResultsAndNoErrorsWhenAllQueriesAreSuccessful:void
然而,测试的名称并不能提供任何信息,因为它没有描述被视为通过测试必须真实的所有内容。
在线阅读(包括here https://stackoverflow.com/questions/735737/multiple-assertions-when-unit-testing-constructor and at 程序员.stackexchange.com https://softwareengineering.stackexchange.com/questions/7823/is-it-ok-to-have-multiple-asserts-in-a-single-unit-test)有一个相当大的阵营主张单元测试应该只有一个断言(作为指导)。因此,当测试失败时,您确切地知道失败的内容(即 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
and teardown
方法。
虽然这个问题与其他问题类似,但我正在寻找这个特定场景的答案,因为我认为它很好地代表了复杂的单元测试场景,展示了需要验证的多种状态和行为。不幸的是,许多其他问题没有示例,或者示例没有展示复杂的状态和行为。