assert.verifySteps()

追加されたバージョン: 2.2.0.

説明

verifySteps( steps, message = "" )

テストにおいて、以前にマーキングされたステップの存在と正確な順番を確認します。

名前 説明
steps (array) 文字列のリスト
message (string) 短い説明

ステップ API は、非同期コード、イベント駆動コード、コールバック駆動コードのいずれであっても、実行論理を非常に正確かつ精密に検証するための簡単な方法を提供します。

たとえば、コードの一部に正しくアクセスできているかどうかを確認したり、非同期コードパスの実行頻度(回数)を確認したりするために、ステップをマークできます。予期しないステップをキャプチャすることもできます。予期しないステップは自動的に検出され、テストの失敗の一部として表示されます。

このアサーションは、文字列値の配列を、assert.step()への前回の呼び出しを介して以前に記録されたステップのリストと比較します。

verifySteps()を呼び出すと、ステップの内部リストがクリアされてリセットされます。これにより、同じテスト内にassert.step()の複数の独立したシーケンスが存在できます。

以下の例を参照し、テストスイートでステップ API を使用する方法を学んでください。

イベントベースのインターフェースをテストする

この例では、Node.js およびその他の環境で提供されるものなど、EventEmitter に基づいたクラスを使用します。

QUnit.test('good example', async assert => {
  const maker = new WordMaker();
  maker.on('start', () => {
    assert.step('start');
  });
  maker.on('data', (word) => {
    assert.step(word);
  });
  maker.on('end', () => {
    assert.step('end');
  });
  maker.on('error', message => {
    assert.step('error: ' + message);
  });

  await maker.process('3.1');

  assert.verifySteps(['start', '3', 'point', '1', 'end']);
});

ステップ API を使用せずにこのシナリオにアプローチする場合、比較チェックをイベントコールバック内に直接配置したくなります。テストが制御できないコールバックにダミーアサーションを作成することは、アンチパターンとみなされます。これにより不十分な保証が作成され、簡単に誤検出(コールバックが実行されない、順番が異なる、または複数回実行される可能性がある)が発生する可能性があります。デバッグ情報もかなり限定されます。

// WARNING: This is a BAD example
QUnit.test('bad example 1', async assert => {
  const maker = new WordMaker();
  maker.on('start', () => {
    assert.true(true, 'start');
  });
  maker.on('middle', () => {
    assert.true(true, 'middle');
  });
  maker.on('end', () => {
    assert.true(true, 'end');
  });
  maker.on('error', () => {
    assert.true(false, 'error');
  });

  await maker.process();
});

より堅牢なアプローチには、ローカル配列を含めることができます。この配列は後でdeepEqualを使用して確認します。これにより順序不同の問題、予期しない値、重複値が検出されます。問題が発生した場合に詳細なデバッグ情報も提供します。以下は、ステップ API の仕組みの本質です。

QUnit.test('manual example without Step API', async assert => {
  const values = [];

  const maker = new WordMaker();
  maker.on('start', () => {
    values.push('start');
  });
  maker.on('middle', () => {
    values.push('middle');
  });
  maker.on('end', () => {
    values.push('end');
  });
  maker.on('error', () => {
    values.push('error');
  });

  await maker.process();

  assert.deepEqual(values, ['start', 'middle', 'end']);
});

パブリッシュ/サブスクライブシステムをテストする

ステップ APIを使用して、Pub-Sub チャンネルまたはトピックで受信したメッセージを確認します。

QUnit.test('good example', assert => {
  const publisher = new Publisher();

  const subscriber1 = (message) => assert.step(`Sub 1: ${message}`);
  const subscriber2 = (message) => assert.step(`Sub 2: ${message}`);

  publisher.subscribe(subscriber1);
  publisher.subscribe(subscriber2);
  publisher.publish('Hello!');

  publisher.unsubscribe(subscriber1);
  publisher.publish('World!');

  assert.verifySteps([
    'Sub 1: Hello!',
    'Sub 2: Hello!',
    'Sub 2: World!'
  ]);
});

1 つのテスト内の複数のステップ検証

verifySteps() を呼び出すと、観察されたステップの内部バッファは自動的にリセットされます。

QUnit.test('multiple verifications example', assert => {
  assert.step('one');
  assert.step('two');
  assert.verifySteps(['one', 'two']);

  assert.step('three');
  assert.step('four');
  assert.verifySteps(['three', 'four']);
});