(更好) Chai 浅层深层相等插件
该模块为 chai 提供了一个 shallowDeepEqual
断言的直接替换,它使用严格语义和直观的输出差异。
在幕后,该库包装了 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:expect
,should
和 assert
。
对 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'
}