これが私の具体的なシナリオです。
ArcGIS APIforFlex内でクラスQueryQueue
をラップするクラスがあります。QueryTask
これにより、実行のために複数のクエリタスクを簡単にキューに入れることができます。呼び出しQueryQueue.execute()
は、キュー内のすべてのタスクを繰り返し処理し、それらの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
各クエリタスクで1回だけ呼び出す必要がありますinProgress = true
結果が保留中の間inProgress = false
結果が処理されたときcompleted
結果が処理されたときにディスパッチされますcanceled
呼び出されることはありません- キュー内で実行される処理は、クエリ結果を正しく処理およびパッケージ化します
私が苦労しているのは、これらのテストを読み取り可能で論理的で保守可能なテストに分割することです。
論理的には、1つの状態、つまり成功した実行状態をテストしています。これは、上記の#1から#6をアサートする1つの単体テストが真であることを示唆します。
[Test] public mustReturnQueryQueueEventArgsWithResultsAndNoErrorsWhenAllQueriesAreSuccessful:void
ただし、テストの名前は、テストに合格したと見なされるために真でなければならないすべてのことを説明しているわけではないため、有益ではありません。
オンライン(こことprogrammers.stackexchange.comを含む)を読むと、単体テストには(ガイドラインとして)1つのアサーションのみが必要であると主張するかなりの規模のキャンプがあります。その結果、テストが失敗した場合、何が失敗したかを正確に知ることができます(つまり、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
。
この質問は他の質問と似ていますが、検証が必要な複数の状態と動作を示す複雑な単体テストシナリオの適切な表現であると思うため、この特定のシナリオに対する回答を探しています。他の質問の多くには、残念ながら、例がないか、例が複雑な状態と動作を示していません。