QUnit - 循环测试,索引始终相同

时间:2016-03-15 20:56:23

标签: javascript jquery qunit

我正在尝试测试一些代码,为此我需要在循环中进行一些测试,如下所示:

for (var i = 1; i <= 5; i++) {
    QUnit.test('Hello ' + i, (assert) => {
        console.log(i);
        assert.ok( 1 == '1', 'Result: ' + i);
    });
}

Click here for working example at jsFiddle

但由于某些原因,循环中的i(和结果)总是6,所以这段代码给出了这样的输出:

6
6
6
6
6

我做错了什么?

1 个答案:

答案 0 :(得分:4)

鉴于QUnit在运行它们之前定义了所有测试,你是var范围的经典问题的受害者 - var被绑定到函数,而不是{{1} }循环。

这意味着:
您可以使用for的给定值定义测试,但是当测试实际运行时,此值将会更改。

你有几种解决方法:

创建IIFE并在其中定义测试

i

为什么会这样:上面的for (var i = 1; i <= 5; i++) { (function (j) { QUnit.test('Hello ' + j, (assert) => { console.log(j); assert.ok( 1 == '1', 'Result: ' + j); }); })(i); } 变量将绑定到该IIFE的范围。测试运行时,它的值不会改变。

在ES6环境中使用j关键字

let

为什么会有效: ES6 finally introduces block scoping,但这是通过关键字for (let i = 1; i <= 5; i++) { QUnit.test('Hello ' + i, (assert) => { console.log(i); assert.ok( 1 == '1', 'Result: ' + i); }); } let完成的。

这个答案的某些部分来自here