当前位置: 首页 > 工具软件 > Chai > 使用案例 >

chai断言库学习3-Core Plugin Concepts

许安邦
2023-12-01

接上一篇https://blog.csdn.net/weixin_42429288/article/details/97898933,这一篇主要是核心插件

Core Plugin Concepts

插件不仅仅用于编写供应商集成。作为测试人员,可以编写一个插件来验证输入数据、对对象进行模式验证或确保DOM元素的正确行为。API足够灵活,任何同步任务都可以很容易地封装在单个断言中,并在整个测试中重用。

本教程将向您展示如何访问CHAI的插件API,使用标志通过语言链传输数据,以及编写第一个断言(以及彻底的错误消息)。在这里完成之后,https://www.chaijs.com/guide/helpers/将向您展示如何组合属性和方法以在chai语言链上使用。

Accessing Utilities

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)。

Using Flags

断言如何在内部工作的最核心概念是标记的概念。每个断言都有一组主要与之相关联的任意标志-键:值对。Chai在内部使用了一小部分这样的软件,但是这个商店也可以供开发者扩展。

flag usage

在我们的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

object flag

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

Composing an Assertion

在我们开始向语言链添加方法和属性之前,我们应该首先研究如何调用断言,以及在断言失败时预期的行为。

为此,每个构造的断言都有一个称为simply assert的方法。它接受许多参数,并且它的行为可以根据断言是否被否定而改变。

Basic Assertion

重构一下见分晓

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。

Composing Error Messages

从上面的示例中可以看到,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

 

 类似资料: