在 Mocha 测试中遇到的 “Error: expected [ Function] to have a length of 0 but got 1” 解决方法
Mocha 是一个流行的 JavaScript 测试框架,被广泛用于前端开发中。如同其官网指出的,Mocha 提供了许多特性,包括异步测试,测试覆盖率报告,IDE 集成,多浏览器测试以及最微小的录音设置——所有这些都适用于编写 Test Driven Development(TDD)或 Behavior Driven Development(BDD)测试。但是,在编写测试用例时,常常会遇到以下错误提示:
Error: expected [Function] to have a length of 0 but got 1
遇到这个错误时,我们应该怎样解决?
错误的原因
在使用 Mocha 编写测试用例时,我们在测试一个函数时往往需要检查它的参数个数是否正确。为此,Mocha 提供了 lengthOf
断言来检测函数的参数个数。例如:
-- -------------------- ---- ------- ----- ------ - ----------------------- -------- ------ -- - ------ - - -- - --------------- ---------- - ---------- ---- --- ------------ ---------- - -------------------------------- --- ---
执行测试时,如果 add
函数的参数个数不是 2,就会出现上述错误。
该错误的根本原因在于,Mocha 中的 lengthOf
函数只适用于普通函数,而不适用于箭头函数。如果我们在测试一个箭头函数时使用了 lengthOf
断言,就会得到上述错误。
例如:
-- -------------------- ---- ------- ----- ------ - ----------------------- ----- --- - --- -- -- - ------ - - -- -- --------------- ---------- - ---------- ---- --- ------------ ---------- - -------------------------------- --- ---
这时就会出现“Error: expected [Function] to have a length of 0 but got 1”的错误。
解决方法
要解决这个问题,我们需要把箭头函数转换为普通函数。一种解决方法是使用 ES5 的函数声明方式,例如:
-- -------------------- ---- ------- ----- ------ - ----------------------- --- --- - ----------- -- - ------ - - -- -- --------------- ---------- - ---------- ---- --- ------------ ---------- - -------------------------------- --- ---
这时再次执行测试用例,就能得到预期的测试结果了。
另一种解决方法是使用 ES6 的 Function.prototype.bind
方法,例如:
-- -------------------- ---- ------- ----- ------ - ----------------------- ----- --- - --- -- -- - ------ - - -- ------------- --------------- ---------- - ---------- ---- --- ------------ ---------- - -------------------------------- --- ---
在这个例子中,我们通过 bind
方法将箭头函数绑定到一个空对象上,从而创建了一个普通函数。这种方法的好处在于,我们可以使用箭头函数的简洁表达方式,同时又能够通过 bind
方法将其转换为普通函数。
总结
在 Mocha 测试中遇到“Error: expected [Function] to have a length of 0 but got 1”这个错误时,我们需要注意检查被测试的函数是否为箭头函数。如果是箭头函数,就需要将其转换为普通函数,例如使用函数声明方式或 bind
方法。这样,我们就能解决这个问题,并且得到正确的测试结果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a992cf48841e98945bea53