如何在 Chai 中使用自定义 matchers
Chai 是一种常用的 JavaScript 测试框架,它可以与 Mocha、Jasmine 等测试框架一起使用。它的优点之一就是灵活性,它允许我们自定义 matchers 来测试各种情况。下面介绍如何在 Chai 中使用自定义 matchers。
首先需要安装 Chai:
npm install chai --save-dev
然后,我们可以编写一个自定义 matcher。自定义 matcher 是在 Chai 中定义一个函数,函数用于执行一些自定义测试。这个函数接受两个参数:第一个参数是测试对象,第二个参数是断言信息。自定义 matcher 必须返回一个对象,其中包含一个 pass
属性和一个 message
属性。pass
属性是一个布尔值,表示测试是否通过,而 message
属性则是一个字符串,用于描述测试的详细结果。
例如,下面是一个自定义 matcher,用于测试数字是否为偶数:
chai.assert.evenNumber = function(num, message) { var isEven = num % 2 === 0; var failMessage = message || 'Expected ' + num + ' to be even'; return { pass: isEven, message: failMessage, }; };
在这个自定义 matcher 中,我们首先计算数字是否为偶数,然后根据 message
参数构造测试结果。注意,这里我们使用 chai.assert
命名空间来添加自定义 matcher,但你也可以使用 chai.expect
或 chai.should
。
接下来,我们可以运行自定义 matcher 来测试数字是否为偶数:
var assert = chai.assert; assert.evenNumber(2); // OK assert.evenNumber(3); // Error: Expected 3 to be even
可以看到,当数字为偶数时,测试通过;当数字为奇数时,测试失败。
除了自定义 matcher,我们还可以编写一个自定义 plugin,让我们可以更方便地使用自定义 matcher。自定义 plugin 是为 Chai 编写的一个函数,该函数用于添加新的语法功能。使用自定义 plugin,我们可以像使用内置 matcher 一样使用自定义 matcher。
下面我们编写一个自定义 plugin,用于测试字符串是否包含给定的子字符串。
-- -------------------- ---- ------- ----------------------- ------ - --- ------ - ------------ --------------- - ------------- ------- -------- - --- -------- - ------------------- --- --- --- ----------- - ------- -- --------- -- - --- - -- -- ------- -- - ------ - ---- ------ - ----- --------- -------- ------------ -- -- ---
在这个自定义 plugin 中,我们使用了 chai.use()
方法来添加 contains
方法。在 contains
方法中,我们首先计算字符串是否包含子字符串,然后根据 message
参数构造测试结果。最后,我们需要在 utils.addMethod()
中注册 contains
方法,以使其成为 Chai 断言函数的一部分:
-- -------------------- ---- ------- ----------------------- ------ - --- ------ - ------------ --------------- - ------------- ------- -------- - --- -------- - ------------------- --- --- --- ----------- - ------- -- --------- -- - --- - -- -- ------- -- - ------ - ---- --------------------- ------------ ------------------------- ---- ----- ------- ----- -- ------------------------------------------- ---------- ---------- - ---------------- ----------- ------ --- -------------------------------------------------- ------------- ---------- - ---------------------------- ------------ --------- ------- -- ------- -- ----- --- -- --- ----- ------------ --------- ------- --- -- ------- --- -- --- ----- ------------- -- ---------- - ------ ------------ - -- ---
这个自定义 plugin 其实包含三个方法:contains
、contain
和 substrings
。其中,contains
是自定义 matcher,contain
和 substrings
则用于改善语法,使我们能够更方便地使用自定义 matcher。
最后,我们来使用新的语法来测试两个字符串是否包含给定的子字符串:
var assert = chai.assert; assert.contains('hello world', 'world'); // OK assert.contains('hello world', 'universe'); // Error: Expected "hello world" to contain "universe" assert.strictEqual('hello world', 'world').contain('hello'); // Error: expected 'world' to contain 'hello' assert.includes('hello world', ['world', 'moon']).substrings(); // Error: expected 'hello world' to contain at least one of the given substrings
可以看到,使用自定义 plugin,我们可以更方便地使用自定义 matcher,并改善测试语法。
总结
在 Chai 中使用自定义 matcher 和 plugin 可以让我们更方便地编写测试,并减少测试代码的重复性。希望这篇文章能够帮助你更好地使用 Chai 来编写测试代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ef10cdf6b2d6eab3912b5b