如何在 Chai 中自定义新的断言方法
Chai 是一款流行的 JavaScript 断言库,它支持 BDD 和 TDD 风格写法,以及针对不同环境的多个插件。但是,它不一定满足所有测试用例的需求。有时候,我们需要自定义一些断言方法,以便更好地适应我们的测试场景。本文将介绍在 Chai 中如何自定义新的断言方法。
Chai 的断言方法简介
在 Chai 中,有三种类型的断言方法:should、expect 和 assert。它们都可以用来进行断言,但是写法和语法略有不同。下面是一个例子:
-- -------------------- ---- ------- -- ------ ---- -------------------------- ---------------------------- ------------------------ -- ------ ---- ------------------------------ -------------------------------- ---------------------------- -- ------ ---- ------------------ ---------- -------------------- --- ----------------- -------
这三种方法都可以达到相同的断言效果,只不过语法不同。应该选用哪一种方法,一般取决于个人的口味和项目组的规范。
如何自定义新的断言方法
Chai 提供了两种方式来自定义新的断言方法:扩展 chai.Assertion 构造器和创建插件。
扩展 chai.Assertion 构造器
chai.Assertion 是 Chai 中最基本的断言类。我们可以继承它来创建一个新的断言类,并添加我们需要的断言方法。下面是一个示例:
-- -------------------- ---- ------- --- ---- - ---------------- --- ---- - ---------------- -- -- -------------- - -------- ------------------- -------- ------ - ------------------------- ------- -------- ------- - -------------------------- ---------------- -- -------- ---------------------------- - -------- -- - --- ------ - ---------- --- ---------------------- -------------------------------- --- ---------------------- ---------------------------------- -- -- - ------ --------- --------------- ------------ ---------------------------
首先,我们使用了 Node.js 内置的 util 模块,将 MyAssertion 继承了 chai.Assertion。然后,我们在 MyAssertion.prototype 中添加了一个 .beFizz() 方法。
这个方法使用了 chai.Assertion.call(this, ...) 来构造一个新的断言对象,然后通过 this._obj 获取了待检测的实际值。之后,我们分别使用 new chai.Assertion() 来校验字符串类型和是否以 "fizz" 或 "FIZZ" 开头。
最后,我们使用了 chai.expect('') 来生成一个新的测试对象,并在其中连续使用 .beFizz() 和 .not.to.be.a() 断言方法。这样,我们就可以用自定义的 .beFizz() 方法来测试字符串是否以 "fizz" 或 "FIZZ" 开头了。
创建插件
创建插件是另一种自定义新的断言方法的方式。它可以分离项目中的个性化断言方法,以便于在多个项目中重复使用。下面是一个示例:
// 引入 chai 和自定义的插件模块 var chai = require('chai'); chai.use(require('./my-plugin')); // 在 expect 中使用新的断言方法 chai.expect('') .to.beFizz() .and.not.to.be.a('number');
首先,我们引入了 chai 和自定义的插件模块。然后,我们使用了 chai.use() 方法将插件加入到 chai 中。最后,在 chai.expect('') 中使用新的 .beFizz() 方法。
插件代码如下所示:
-- -------------------- ---- ------- -------------- - -------- ------ ------ - ----------------------------------------- --------- -------- -- - --- ------ - ---------- --- ---------------------- -------------------------------- --- ---------------------- ---------------------------------- --- --
在插件代码中,我们将自定义的 .beFizz() 方法添加到了 chai.Assertion.prototype 中,使得它成为了所有 chai.Assertion 对象的公共方法。utils.addMethod() 方法用于在 chai.Assertion.prototype 上添加新的方法。新方法的完整语法是 utils.addMethod(object, name, method),其中 object 是方法所在的对象,name 是方法名,method 是方法体。在本例中,我们将 name 设置为 "beFizz",method 设置为我们自定义的函数。
总结
本文介绍了在 Chai 中自定义新的断言方法。概括起来,有两种方式:扩展 chai.Assertion 构造器和创建插件。前者可以更加方便地在单个项目中添加自定义的断言方法,后者则更适合将这些方法提取为独立的插件,以便于多个项目中的重复使用。通过学习本文,我们可以更好地掌握 Chai 断言库的使用,并在需要的时候自定义新的断言方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66574349d3423812e4c7648b