(更好) Chai 浅层深层相等插件

该模块为 chai 提供了一个 shallowDeepEqual 断言的直接替换,它使用严格语义和直观的输出差异。

NPM version Build Status Coverage Status

在幕后,该库包装了 Unexpected 库,特别地利用了结构化的 “to satisfy” 断言。

使用

安装后,插件可以简单地导入并用作插件

const chai = require("chai");
const expect = chai.expect;

chai.use(require("chai-better-shallow-deep-equal"));

然后可以使用额外的 .shallowDeepEqual() 断言,并且在发生错误时会打印出有用的差异

expect({ foo: true, bar: 0 }).to.shallowDeepEqual({ foo: true, bar: 1 });
expected { foo: true, bar: 0 } to satisfy { foo: true, bar: 1 }

{
  foo: true,
  bar: 0 // should equal 1
}

该断言适用于所有三个 chai API:expectshouldassert

对 ES6 类型支持

该插件支持结构化比较 Map 和 Set 对象

expect(
  new Map([
    ["foo", 1],
    ["bar", false]
  ])
).to.shallowDeepEqual(
  new Map([
    ["foo", 1],
    ["bar", true]
  ])
);
expected new Map[ ['foo', 1], ['bar', false] ])
to satisfy new Map[ ['foo', 1], ['bar', true] ])

new Map[
  ['foo', 1,]
  ['bar',
    false // should equal true
  ]
])
expect(new Set(["foo", "baz"])).to.shallowDeepEqual(
  new Set(["foo", "bar"])
);
expected new Set([ 'foo', 'baz' ]) to satisfy new Set([ 'foo', 'bar' ])

new Set([
  'foo',
  'baz' // should be removed
  // missing 'bar'
])

自定义

添加类型

有时在测试套件中识别特定类型可能是有益的 - 可能是为了自定义它们的显示或以其他方式不同地对待它们。这可以通过使用 addType() API 来实现

const chaiBetterShallowDeepEqual = require("chai-better-shallow-deep-equal");

chaiBetterShallowDeepEqual.addType({
  name: "CustomDate",
  base: "date",
  identify: obj => obj && obj._isCustomDate
});

在上面的例子中,我们试图通过检查它们是否具有“isCustomDate”属性来筛选出在假设的测试套件中出现的特定对象,这些对象使用自定义日期。

鉴于我们对上面 identify() 方法的定义,当插件遇到此类对象时,它会将它们视为 CustomDate 并意识到它们扩展了内置日期类型的行为。

此 API 接受与 Unexpected addType() 方法相同的选项。请参阅链接以获取更详细的描述。

自定义匹配

有了自定义类型,一个常见的愿望是允许自定义识别这些类型的匹配方式。

默认情况下,只有相似的类型才进行比较,但假设在我们的测试中,我们希望允许将任何 CustomDate 对象与 ISO 时间字符串进行比较。

让我们继续我们之前的假设示例 - 我们可以使用 addMatch() API 定义允许比较

chaiBetterShallowDeepEqual.addMatch({
  leftType: "CustomDate",
  rightType: "string",
  handler: (lhs, rhs) => [lhs.toISOString(), rhs]
});

我们在这里定义的是,当我们看到一个 CustomDate 与字符串进行比较时,首先将其转换为 ISO 字符串,然后进行比较。在测试套件中,效果是允许以更易于阅读的方式定义期望

const fooDate = new Date(1583947016326);

expect({ fooDate }).to.shallowDeepEqual({
  fooDate: "2020-03-11T17:16:56.326Z"
});
expected { fooDate: new Date('2020-03-11T17:16:56.326Z') }
to satisfy { fooDate: '2020-03-11T17:16:56.326Z' }

{
  fooDate: new Date('2020-03-11T17:16:56.326Z') // should equal '2020-03-11T17:16:56.326Z'
}