Chai断言测试对象结构是否至少包含其他对象结构

Gol*_*rol 6 javascript tdd bdd assertion chai

我正在使用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}}

我测试过的其他组合havecontains一起deep,any或者all,但没有满足我的愿望.

我发现重复的问题" Chai deep包含对嵌套对象的断言 ",但唯一(downvoted)答案没有意义.它调用deep.eql哪个是多余的,并且在上面它只是不起作用,因为它测试严格的相等性.

我知道我可以单独测试所有属性,但我会很高兴有一个可读的单语句方法来测试一个对象是否是另一个对象的"子集".

更新: 我最终使用Chai 的Shallow Deep Equal插件.

Gol*_*rol 10

Chai有几个可以解决这个问题的插件.

柴集

Chai 有这个子集插件,应该能够做到这一点.

我在浏览器中使用Mocha,但虽然它应该与浏览器兼容,但我还没有使用此插件.

无论如何,这个库包含问题的通用答案,在包含它后,以下行应该有效:

sut.should.containSubset(expected);
Run Code Online (Sandbox Code Playgroud)

柴浅深等于

chai-subset似乎缺少在浏览器中运行它所需的版本,所以我继续寻找插件.我找到的另一个是 深浅相等的.

这个插件也可以在浏览器中使用.从Git下载并使用插件页面上的描述后,在几秒钟内启动并运行,导致:

sut.should.shallowDeepEqual(expected);
Run Code Online (Sandbox Code Playgroud)

它现在很好地忽略了额外的属性sut,但是当属性缺失或不同时,它也会给出很好的断言expected.你会收到这样的消息:

AssertionError:预期有"2"但在路径"/ foo/qux"得到"20".

但是,它没有显示所有断言.如果对象中有两个错误,则只会出现一个(第一个)断言错误.对我而言,这不是一个真正的问题,但它可能会让人感到困惑,因为它可能看起来像是你已经在那里引入了一个新问题.

柴模糊

我自己还没有尝试过chai-fuzzy,(GitHub),但它似乎也可以解决同样的问题,它的存储库也包含插件的浏览器兼容版本.然而,它还需要另一个库,Underscore,这似乎有点矫枉过正.它的语法如下所示:

sut.should.be.like(expected);
Run Code Online (Sandbox Code Playgroud)


x_m*_*ras 5

如果我理解错误,请纠正我,但以下内容适用于纯柴。

expect({foo: {bar: 10}}).to.have.deep.property('foo.bar', 10); // Success
expect({foo: {bar: 11}}).to.have.deep.property('foo.bar', 10); // Fail
expect({foo: {qux: 20}}).to.have.deep.property('foo.bar', 10); // Fail
expect({baz: 'a', foo: {bar: 10, baz: 20}}).to.have.deep.property('foo.bar', 10); // Success
Run Code Online (Sandbox Code Playgroud)