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

Smx*_*Cde 5 javascript jquery qunit

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

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

点击此处查看jsFiddle的工作示例

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

6
6
6
6
6
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

gus*_*nke 4

鉴于 QUnit 在运行测试之前定义了所有测试,您将成为经典var范围问题的受害者 - vars 绑定到函数,而不是循环for

这意味着:
您使用 的给定值定义测试i,但是当测试实际运行时该值将会发生变化。

您有几种方法可以解决这个问题:

创建一个IIFE并在其中定义您的测试

for (var i = 1; i <= 5; i++) {
    (function (j) {
        QUnit.test('Hello ' + j, (assert) => {
            console.log(j);
            assert.ok( 1 == '1', 'Result: ' + j);
        });
    })(i);
}
Run Code Online (Sandbox Code Playgroud)

为什么这样有效:上面的变量j将绑定到 IIFE 的范围。当测试运行时它的值不会改变。

let在ES6环境中使用关键字

for (let i = 1; i <= 5; i++) {
    QUnit.test('Hello ' + i, (assert) => {
        console.log(i);
        assert.ok( 1 == '1', 'Result: ' + i);
    });
}
Run Code Online (Sandbox Code Playgroud)

为什么这样有效: ES6 最终引入了块作用域,但这是通过关键字let或 来完成的const

这个答案的某些部分从这里得到证实