柴有include
办法。我想测试一个对象是否包含另一个对象。例如:
var origin = {
name: "John",
otherObj: {
title: "Example"
}
}
我想用 Chai 来测试这个对象是否包含以下内容(确实如此)
var match = {
otherObj: {
title: "Example"
}
}
这样做似乎不起作用:
origin.should.include(match)
嘿,刚刚发布了 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'
}
}
});
include 和 contains 断言可以用作基于属性的语言链,也可以用作断言在数组中包含对象或在字符串中包含子字符串的方法。当用作语言链时,它们会切换键断言的包含标志。[强调我的]
因此,如果您在对象(不是数组或字符串)上调用包含,那么它仅用于切换键断言的包含标志。从您的示例看来,测试深度相等会更有意义,可能首先检查密钥。
origins.should.include.keys("otherObj");
origins.otherObj.should.deep.equal(match.otherObj);
实际上,现在我浏览其他示例,您可能对此最满意:
origins.should.have.deep.property("otherObj", match.otherObj)
例如,在 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}});
如果您知道子对象的级别,您可以简单地使用:
expect(origin.otherObj).to.include(match.otherObj);