提问人:mingos 提问时间:3/15/2014 最后编辑:Vojtamingos 更新时间:2/25/2016 访问量:2140
事件回调的代码覆盖率
Event callback's code coverage
问:
我使用 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")
修改测试的代码以在事件侦听器的回调中使用匿名函数可修复错误行为:
element.addEventListener("input", function() {
callback();
});
但是,我完全鄙视修改应用程序代码以弥补代码质量控制工具缺陷的“解决方案”。
有没有办法在不将回调包装在匿名函数中的情况下正确拾取代码覆盖率?
答:
回调正在传递到您的方法中。Istanbul 完全不知道该回调来自何处,除了来自您的函数定义。Istanbul 知道 callback() 来自参数 ,但不知道该回调的内部(例如,函数作为回调传入之前的函数)。callback
编辑示例
var callback = function(args) {
//do stuff
}
var foo = function (callback) {
// do stuff
callback(arguments);
}
现在为 foo 的功能创建一个测试,并为 的功能创建一个单独的单元测试。单元测试应该只测试一件事。每个函数都应该有自己的单元测试。执行其应执行的测试(无论回调如何),并且该回调执行其应执行的操作(为测试传入您自己的模拟数据)。通常,命名函数始终是要走的路。callback
foo
评论
我遇到了这个确切的问题,即我的 nodejs 代码部分的回调没有被标记为覆盖,即使我有肯定覆盖它们的测试。我在摩卡/伊斯坦布尔和摩卡/毯子.js上都有这个问题。
我最终注意到我的许多测试都没有在代码覆盖率下运行,这导致我遇到了这个问题。
我通过向 mocha 添加选项来解决它,因为一些测试在子目录中。--recursive
评论