我试图对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的值是
  他们执行自己的回调(有时在循环执行后
  完),不是每个人都有自己的价值。

10-07 13:17
查看更多