我试图对QUnit测试进行一些代码重构。我使用了一个JSON数组TestCaseSource来存储测试用例的输入和预期的输出,并进行如下编码:
var data = TestCaseSource.data;
for (var i in data) {
console.log(data[i]);
QUnit.test(data[i].TestCaseName, function () {
DoProcess(data[i].TestCaseName, "", data[i]);
});
}
使用此代码,我只能运行第一个和最后一个测试用例。 QUnit忽略了中间的所有情况。如果我删除了for循环,并且对QUnit.test进行了硬编码,
QUnit.test('TestCaseName1', function () {
DoProcess('TestCaseName1', "", TestCaseSource.data[0]);
});
QUnit.test('TestCaseName2', function () {
DoProcess('TestCaseName2', "", TestCaseSource.data[1]);
});
...
那时一切都很好。为什么for循环不起作用?
最佳答案
我在Asynchronous Process inside a javascript for loop中找到了答案。就像在这篇非常好的文章中所说的那样:
您必须通过将i的值传递给函数来冻结它的值
某个地方,因此它的值在循环的每次迭代中唯一存在
在函数闭包中。否则,所有异步回调都只会看到
循环结束时i的值是
他们执行自己的回调(有时在循环执行后
完),不是每个人都有自己的价值。