我使用 Karma(当前为 v0.10.10)和 Jasmine 进行单元测试,并使用 Istanbul(通过 karma-coverage)进行代码覆盖率报告。我注意到代码覆盖率报告器在特定情况下的奇怪行为。
我要测试的代码大致是这样的:
/**
* @param {HTMLInputElement} element
*/
var foo = function(element) {
var callback = function() {
// some code
};
element.addEventListener("input", callback);
};
在我的测试中,我在被测元素上调度了一个自定义输入事件,并且回调函数执行。测试检查回调的效果,测试通过。事实上,即使我console.log("foo")
在回调中放了一个毛茸茸的东西,我也可以清楚地看到它被打印出来了。但是,Istanbul 的报告错误地表明回调根本没有执行。
修改测试代码以在事件侦听器的回调中使用匿名函数可修复错误行为:
element.addEventListener("input", function() {
callback();
});
但是,我完全鄙视修改应用程序代码以弥补代码质量控制工具缺陷的“解决方案”。
有没有一种方法可以在不将回调包装在匿名函数中的情况下正确获取代码覆盖率?