【发布时间】:2016-01-30 12:50:40
【问题描述】:
我使用 Mocha 进行单元测试,使用 Chai 进行断言。
我想找到一个易于使用的解决方案来检查对象是否具有我的比较对象中定义的结构和属性。但我不需要对象完全相等。正在测试的主题应该包含至少我的测试对象中的所有属性,但它也可能包含当时未在测试中的其他属性。
所以,我想测试一个单元来检查它返回的对象是否至少有一个名为“foo”的属性,它本身就是一个至少包含值为 10 的属性“bar”的对象。所以,我有要测试的预期结果:
var expected = {foo: {bar: 10}};
我打电话给我的单位并将我的测试对象放在一个变量sut:
var sut = MyUnit.myFunction();
因此,对于各种 sut,我期望这些结果:
// Success. Exact match
{foo: {bar: 10}}
// Fail. Structure is ok, but property value is wrong.
{foo: {bar: 11}}
// Fail. property bar is missing.
{foo: {qux: 20}}
// Success. All properties match. Extra properties (baz) in sut are ignored:
{baz: 'a', foo: {bar: 10, baz: 20}}
然后我想以一种方便的方式进行比较。我可以单独测试所有属性或将其拆分为多个测试,但我希望我可以做类似的事情
sut.should.deep.contain.all(expected);
然而,我得到了以下令人惊讶的结果,即使对象完全相同:
AssertionError: 预期 { foo: { bar: 10 } } 的属性 'foo' 为 { bar: 10 },但得到了 { bar: 10 }
当然,我尝试过这个,以及其他几个变体。如果对象包含额外的属性,最简单的相等性测试将不起作用。
sut.should.eql(expected);
AssertionError: 预期 { foo: { bar: 10, qux: 20 } } 深度等于 { foo: { bar: 10 } }
我已经测试了have 和contains 以及deep、any 或all 的其他组合,但没有一个能满足我的愿望。
我发现了重复的问题“Chai deep contains assertion on nested objects”,但唯一(被否决的)答案没有意义。它调用deep.eql,这是多余的,而且它只是不起作用,因为它测试严格相等。
我知道我可以单独测试所有属性,但如果有一个可读的单语句方法来测试一个对象是否是另一个对象的“子集”,我会很高兴。
更新: 我最终为 Chai 使用了 Shallow Deep Equal 插件。
【问题讨论】:
-
这类似于 React 的
PropTypes.shape函数。另请查看github.com/sashafklein/shape
标签: javascript tdd bdd chai assertion