无法使用“.nested”标志和括号表示法检查嵌套对象 属性

Unable to check a nested object property by using the ".nested" flag and bracket notation

Chai 4 及更高版本的 .nested.property() 在早期版本中是 .deep.property()。我描述的问题在 Chai 4 或更高版本中的 .nested.property() 和 4 之前的版本中的 .deep.property() 都存在。

我一直在尝试使用 .nested 标志和括号符号来检查嵌套 属性 的值。当我尝试寻址到数组时,它可以工作,但是如果我想通过执行 "a['name']" 来寻址到一个对象,它就不起作用。这是令人困惑的,因为在 JavaScript 中,a.namea["name"] 都指的是相同的 属性,并且在某些情况下,由于名称的结构,我们必须使用方括号.

我有一个问题的例子如下。如果你 运行 这个,你会看到 "first expect passed",但你不会看到 "second expect passed",因为第二个断言失败。

const { expect } = require("chai");

const obj = {
    "a": ["foo", "bar"],
    "b": { "foo-bar": 1},
};

expect(obj).to.have.nested.property("a[1]").equal("bar");
console.log("first expect passed");


expect(obj).to.have.nested.property("b['foo-bar']").equal(1);
console.log("second expect passed");

这没有明确记录,但问题是 Chai 实际上并没有以 exact 与 [=22= 相同的方式解释您传递给 .property 的参数] 口译员会。使用 b['foo-bar'] 是很自然的,因为如果您访问 JavaScript 中的 属性,那是您希望 必须 做的事情代码,但这不适用于 Chai。你要做的是:

expect(obj).to.have.nested.property("b.foo-bar").equal(1);
console.log("second expect passed");

.property 中的括号表示法本质上仅用于对数组进行寻址。当涉及到对象时,你必须使用点符号,即使在它无效的情况下 JavaScript.