使用 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
的方法调用。
我想为测试加载一个配置文件。
其中一个参数是类型。
那么我该如何替换下一行。
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
的方法调用。