欢迎来到 Chai

很高兴您决定尝试 Chai.js!如果您是第一次访问,请熟悉基本知识,例如安装和我们包含的断言风格。

基础知识

制作插件

在您深入了解 Chai 中包含的内容后,下一步就是学习如何通过插件扩展 Chai。Chai 的强大功能远超其包含的内容,仅受您想要实现的目标的限制。插件 API 还旨在通过为用户提供一种将常见断言封装起来以重复使用的方式来简化测试。

在插件中暴露全局变量

在创建 Chai 插件时,可以暴露全局变量,这些变量可以在多个文件中使用。以下是如何可持续地做到这一点。

良好实践

最好将任何全局变量导出到模块记录中,以便可以将其直接导入,而不是将其作为 chai 对象的属性添加。

// An example of a good plugin:

export const myGlobal = {...};

export default function myPlugin(chai, utils) {
}

潜在问题

避免仅通过 chai.use() 暴露全局变量,而没有使其可供导入,因为这会导致在尝试跨多个文件使用全局变量时出现问题。

// An example of a plugin which may have issues:

const myGlobal = {...};

export default function myPlugin(chai, utils) {
  chai.myGlobal = myGlobal;
}
// Another example of a plugin which may have issues:

export default function myPlugin(chai, utils) {
  chai.myGlobal = {...};
}

防止对 use(..) 的多次调用。

在某些情况下,use(..) 函数可能会使用您的插件多次调用。对于许多插件来说,这不是问题,但最好检查插件是否已应用。

以下是一个关于如何在您的插件中实现检查的虚构示例,但实际实现留给插件作者。

import * as chai from 'chai';

let overwritten = false;

function somePlugin(base) {
  if (!overwritten) {
    base.util.overwriteMethod(base.Assertion.prototype, "equal", function (_super) {
      return function(...args) {
        console.log("Called!"); // log something out

        return _super.call(this, ...args);
      };
    });
    overwritten = true;
  }
}

chai.use(somePlugin);
chai.use(somePlugin);

chai.expect(123).to.equal(123); // Logs `Called!` only once

通过遵循这些准则,您可以创建易于使用和维护的 Chai 插件。