assert.verifySteps()

添加版本: 2.2.0.

描述

verifySteps( steps, message = "" )

验证测试中先前标记步骤的存在和确切顺序。

名称 描述
steps (数组) 字符串列表
message (字符串) 简短描述

Step API 提供了一种简单的方法来高度准确和精确地验证执行逻辑,无论是异步代码、事件驱动代码还是回调驱动代码。

例如,您可以标记步骤以观察和验证代码的各个部分是否被正确地访问,或者检查异步代码路径的执行频率(执行次数)。您还可以捕获任何意外步骤,这些步骤会自动检测并作为测试失败的一部分显示。

此断言将给定的字符串值数组与先前记录的步骤列表进行比较,这些步骤是通过先前对 assert.step() 的调用标记的。

调用 verifySteps() 将清除并重置内部步骤列表。这允许在同一个测试中存在多个独立的 assert.step() 序列。

参考以下示例,了解如何在测试套件中使用 Step API。

示例

测试基于事件的接口

此示例使用基于 EventEmitter 的类,例如 Node.js 和其他环境提供的类

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

在处理此场景时,**如果没有 Step 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 检查它。这可以捕获顺序错误、意外值和重复值。它还在出现问题时提供详细的调试信息。以下是 Step 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']);
});

测试发布/订阅系统

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