23

include办法。我想测试一个对象是否包含另一个对象。例如:

var origin = {
  name: "John",
  otherObj: {
    title: "Example"
  }
}

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

var match = {
  otherObj: {
    title: "Example"
  }
}

这样做似乎不起作用:

origin.should.include(match)
4

5 回答 5

33

嘿,刚刚发布了 chai-subset。看看这个: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'
         }
     }
 });
于 2014-07-15T11:59:47.243 回答
17

include 和 contains 断言可以用作基于属性的语言链,也可以用作断言在数组中包含对象在字符串中包含子字符串的方法。当用作语言链时,它们会切换键断言的包含标志。[强调我的]

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

origins.should.include.keys("otherObj");
origins.otherObj.should.deep.equal(match.otherObj);

实际上,现在我浏览其他示例,您可能对此最满意:

origins.should.have.deep.property("otherObj", match.otherObj)
于 2013-02-28T20:42:54.887 回答
11

例如,在 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}});
于 2019-01-11T21:04:54.073 回答
3

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

expect(origin.otherObj).to.include(match.otherObj);

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

于 2020-05-13T03:54:49.777 回答
-3

在 Chai 1.5.0 你会发现方便的方法

includeDeepMembers

http://chaijs.com/releases/

于 2016-04-20T10:39:42.953 回答