接上一篇https://blog.csdn.net/weixin_42429288/article/details/97898933,这一篇主要是核心插件
插件不仅仅用于编写供应商集成。作为测试人员,可以编写一个插件来验证输入数据、对对象进行模式验证或确保DOM元素的正确行为。API足够灵活,任何同步任务都可以很容易地封装在单个断言中,并在整个测试中重用。
本教程将向您展示如何访问CHAI的插件API,使用标志通过语言链传输数据,以及编写第一个断言(以及彻底的错误消息)。在这里完成之后,https://www.chaijs.com/guide/helpers/将向您展示如何组合属性和方法以在chai语言链上使用。
chai提供了许多实用程序来帮助构建断言,但它没有直接在chai出口上提供这些实用程序。这些可以通过使用chai export的use方法访问,后者接受一个函数作为参数。
chai.use(function (_chai, utils) {
// ...
});
将要使用的函数将向其作用域传递两个参数。第一个是chai导出,第二个是包含许多实用方法的对象(我们将在一分钟内讨论这些方法)。
chai导出包含在内,这样您就可以构建可用于多个测试文件的助手,或者将助手打包为一个插件以与社区共享。创建助手的更合适模式如下…
帮助文件:test/helpers/model.js
module.exports = function (chai, utils) {
var Assertion = chai.Assertion;
// your helpers here
};
测试文件:test/person.js
var chai = require('chai')
, chaiModel = require('./helpers/model')
, expect = chai.expect;
chai.use(chaiModel);
对于本文档的其余部分,我们将假定此结构…
外部文件中的帮助程序
分配给断言变量的断言
我们的所有助手都将在导出函数内,位于指定的位置。
断言变量现在是断言链的构造函数;新断言(obj)现在等价于expect(obj)。
断言如何在内部工作的最核心概念是标记的概念。每个断言都有一组主要与之相关联的任意标志-键:值对。Chai在内部使用了一小部分这样的软件,但是这个商店也可以供开发者扩展。
在我们的use函数中,flag实用程序公开为utils.flag。它可以作为getter或setter,这取决于传递给它的参数的数量。
var myAssert = new Assertion(obj);
utils.flag(myAssert, 'owner', 'me'); // sets key `owner` to `me`
var owner = utils.flag(myAssert, 'owner'); // get key `owner', returns value
chai的保留标记中最重要的是对象标记。这是断言的主题。
var myAssert = new Assertion('Arthur Dent');
var obj = flag(myAssert, 'object'); // obj === 'Arthur Dent';
此标志经常被使用,以至于快捷方式_obj被作为构造断言的obj属性提供。
var obj = myAssert._obj; // obj === `Arthur Dent`
以下标志由Chai的核心断言使用。干预这些可能会有副作用。
object: (see above)
ssfi: start stack function - used to prevent callback stacks from being shown in errors.
message: additional information to include with an error when using assert interface.
negate: set when .not is included in the chain.
deep: set when .deep is included in the chain. used by equal and property
contains: set when include or contain is used as a property. changes the behavior of keys.
lengthOf: set when length is used as a property. changes the behavior of above, below, and within
在我们开始向语言链添加方法和属性之前,我们应该首先研究如何调用断言,以及在断言失败时预期的行为。
为此,每个构造的断言都有一个称为simply assert的方法。它接受许多参数,并且它的行为可以根据断言是否被否定而改变。
重构一下见分晓
var arthur = new Assertion('Arthur Dent');
arthur.assert(
arthur._obj === 'Arthur Dent'
, "expected #{this} to be 'Arthur Dent'"
, "expected #{this} to not be 'Arthur Dent'"
);
chai将检查第一个参数;如果为真,则断言通过,但如果为假,则断言失败,并且第一条错误消息将作为chai.assertion error的一部分抛出。相反,如果语言链被否定,它将认为是错误的一次通过和错误的一次失败。第二条错误消息将包含在引发的错误中。
总之,assert方法接受六个参数
a boolean布尔值(真值检验的结果),
如果第一个参数为false,则使用的字符串错误消息,
如果断言被否定并且第一个参数为真,则使用的字符串错误消息,
(可选)预期值,
(可选)实际值,默认为,
(可选)一个布尔值,指示如果第一个参数为假,除了消息之外是否显示diff。
从上面的示例中可以看到,chai可以接受模板标记来动态地编写错误消息。使用时,这些模板标记将替换为相关对象的字符串化替换。有三个模板标签可用
#{this}: the _obj of the assertion
#{exp}: the expected value, if it was provided in assert
#{act}: the actual value, defaults to _obj but can be overwritten by value provided in assert