使用 chai js 进行自动化测试

Automated testing with chai js

我想为测试加载一个配置文件。

其中一个参数是类型。

那么我该如何替换下一行。

expect(res.body).to.deep.equal(test.expect)

与 "to.deep.equal" 字符串。

我试过了:

let exp = expect(res.body);
test.type.split('.').forEach(t => exp = exp[t])
exp(test.expect)

但后来我得到了:

Uncaught TypeError: this.assert is not a function
  at assertEqual (node_modules\chai\lib\chai\core\assertions.js:1026:12)

编辑:

我设法通过以下方式做到了:

let exp = expect(res.body);
test.type.split('.').slice(0,-1).forEach(t => exp = exp[t])
exp[_.last(test.type.split('.'))](test.expect)

我很想得到一个解释。如果存在另一种方式。

因为您破坏了最后一个成员 (equal) 的 thisValue,它尝试访问但不再绑定到 deep 对象。

(我真的在屠杀解释)。

你可以这样做:

let exp = expect(res.body);
test.type.split('.').forEach(t => {
    exp = typeof exp[t] === 'function'
        ? exp[t].bind(exp)
        : exp[t];
});
exp(test.expect)

为了进一步解释,这就是您看到 TypeError: this.assert is not a function 的原因 - equal 调用试图访问 deep 对象的 this.assert,但是this 不再受其约束。通过 .bind() 显式绑定它,我们可以保留它。

这也是您的第二个代码示例起作用的原因,因为您正确地将 equal() 作为 deep 的方法调用。