我正在使用Mocha进行单元测试,使用Chai进行断言.
我想找到一个易于使用的解决方案来检查对象是否具有我的比较对象中定义的结构和属性.但我不需要对象完全相等.被测对象应该至少包含我的测试对象中的所有属性,但它也可能包含当时未测试的其他属性.
所以,我想测试一个单元来检查它返回的对象是否至少有一个名为'foo'的属性,它本身就是一个至少包含值为10的属性'bar'的对象.所以,我有这个预期的结果测试:
var expected = {foo: {bar: 10}};
Run Code Online (Sandbox Code Playgroud)
我打电话给我的单位并将我的测试主题放在一个变量中sut:
var sut = MyUnit.myFunction();
Run Code Online (Sandbox Code Playgroud)
所以对于各种suts,我期待这些结果:
// 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}}
Run Code Online (Sandbox Code Playgroud)
然后我想以方便的方式比较它.我可以单独测试所有属性或在多个测试中拆分它,但我希望我可以做类似的事情
sut.should.deep.contain.all(expected);
Run Code Online (Sandbox Code Playgroud)
但是,即使对象完全相同,我也得到了以下令人惊讶的结果:
AssertionError:期望{foo:{bar:10}}的属性'foo'为{bar:10},但得到{bar:10}
当然我试过这个,以及其他几个变种.如果对象包含额外的属性,则最简单的相等测试不起作用.
sut.should.eql(expected);
Run Code Online (Sandbox Code Playgroud)
AssertionError:期望{foo:{bar:10,qux:20}}深度相等{foo:{bar:10}}
我测试过的其他组合have和contains一起deep …