Chai.js:对象包含/包含

13 javascript arrays tdd object chai

有一种include方法.我想测试一个对象是否包含另一个对象.例如:

var origin = {
  name: "John",
  otherObj: {
    title: "Example"
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用Chai来测试这个对象是否包含以下内容(它确实如此)

var match = {
  otherObj: {
    title: "Example"
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做似乎不起作用:

origin.should.include(match)
Run Code Online (Sandbox Code Playgroud)

eag*_*eye 22

嘿,刚出版的柴子.看看这个:https://www.npmjs.org/package/chai-subset 这应该适合你)

 var chai = require('chai');
 var chaiSubset = require('chai-subset');
 chai.use(chaiSubset);

 var obj = {
     a: 'b',
     c: 'd',
     e: {
         foo: 'bar',
         baz: {
             qux: 'quux'
         }
     }
 };

 expect(obj).to.containSubset({
     e: {
         foo: 'bar',
         baz: {
             qux: 'quux'
         }
     }
 });
Run Code Online (Sandbox Code Playgroud)

  • 如果它能准确地告诉断言失败的是哪个属性,那就太好了 (2认同)

Dav*_*lin 14

在包括和包含断言可以用作任一基于属性的语言链作为方法来断言的对象的在包含阵列中一个或一个子字符串.当用作语言链时,它们切换键断言的包含标志.[强调我的]

因此,如果您在对象(不是数组或字符串)上调用include,那么它仅用于切换键断言的contains标志.通过您的示例的外观,测试深度相等会更有意义,可能首先检查密钥.

origins.should.include.keys("otherObj");
origins.otherObj.should.deep.equal(match.otherObj);
Run Code Online (Sandbox Code Playgroud)

实际上,现在我浏览其他例子,你可能会对此最开心:

origins.should.have.deep.property("otherObj", match.otherObj)
Run Code Online (Sandbox Code Playgroud)

  • 我确实阅读了文档,但有时您需要更多上下文,您知道吗?感谢您的回答。 (2认同)

jc1*_*jc1 6

例如,在 chai 4.2.0 中,您可以使用 deep include

chaijs 文档示例:

// Target array deeply (but not strictly) includes `{a: 1}`
expect([{a: 1}]).to.deep.include({a: 1});
expect([{a: 1}]).to.not.include({a: 1});

// Target object deeply (but not strictly) includes `x: {a: 1}`
expect({x: {a: 1}}).to.deep.include({x: {a: 1}});
expect({x: {a: 1}}).to.not.include({x: {a: 1}});
Run Code Online (Sandbox Code Playgroud)


Seb*_*rin 6

如果您知道子对象的级别,您可以简单地使用:

expect(origin.otherObj).to.include(match.otherObj);
Run Code Online (Sandbox Code Playgroud)

https://www.chaijs.com/api/bdd/