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