assert.verifySteps()

添加的版本:2.2.0

說明

verifySteps( steps, message = "" )

一個輔助斷言,用於驗證測試中步驟的順序和數量。

名字 說明
steps(數組) 字符串列表
message(字符串) 斷言的簡短說明

assert.verifySteps() 斷言將給定的字符串值數組(表示步驟)與先前 step() 調用的順序和值進行比較。此斷言有助於驗證代碼路徑部分的順序和數量,尤其是異步路徑。

調用assert.verifySteps([/* ...snip ... */]) 時,將重置驗證步驟列表。這允許 assert.stepassert.verifySteps 在同一測試中的多種組合。

了解如何使用 Step API 以及它為您的測試套件增加的值。

例子

Step API 嚴格驗證觀察值的順序和頻率。它還允許檢測意外步驟,然後將其顯示為測試失敗的一部分。

測試基於事件的接口

此示例使用基於 EventEmitter 的類,例如由 Node.js 和其他環境提供的類:

QUnit.test('good example', async assert => {
  const thing = new MyThing();
  thing.on('start', () => {
    assert.step('start');
  });
  thing.on('middle', () => {
    assert.step('middle');
  });
  thing.on('end', () => {
    assert.step('end');
  });
  thing.on('error', message => {
    assert.step({ error: message });
  });

  await thing.process();

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

當在沒有 Step API 的情況下處理這種情況時,可能會傾向於將比較檢查直接放在事件回調中。在測試無法控製的回調中進行虛擬斷言被認為是一種反模式,因為這會提供鬆散的保證並且很容易導致誤報(回調可能無法運行、無序運行或多次運行)。如果出現問題,它還提供相當有限的調試信息。

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

  return thing.process();
});

一種不太脆弱的方法可能涉及一個帶有數組的局部計數器變量,我們用 deepEqual 檢查該數組。這會捕獲 out-of-order 問題、意外值、重複值,並在出現問題時提供詳細的調試信息。這本質上是 Step API 的工作原理:

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

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

  return thing.process().then(() => {
    assert.deepEqual(values, [ 'start', 'middle', 'end' ]);
  });
});

測試發布/訂閱係統

使用 Step 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!'
  ]);
});

一次測試中的多步驗證

調用 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' ]);
});