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