0

如果使用 Jasmine 1.3.1,我使用

describe("TryTry", function() {

    var i;

    function checkForSituation(a) {
        // say, if this is made into a function because 
        //   there are a lot of processing

        console.log("THERE", a); 
        expect(foo(3, a)).toEqual( 3 + a );
    }

    for (i = 0; i < 5; i++) {
        console.log("HERE", i); 

        it("should add for " + i, function() {

            checkForSituation(i);

        });

    }

});

而 foo 只是:

function foo(a, b) {
    return a + b;
}

我希望它检查 0 到 4,然后打印出来

HERE 0
THERE 0
HERE 1
THERE 1
  ...

但相反,它只是在 Chrome 的控制台中打印为:HERE 0, HERE 1, ...然后THERE 5五次。有人知道为什么expect不能将 an 放在这样的外部函数中,如果我需要在函数中放入许多步骤,在 Jasmine 中该怎么做?

附带说明一下,有时在 JavaScript 中,我觉得开发了一种全新的语言,而您通常可以做的事情却行不通——并且想知道可以做些什么来防止这种事情发生,而不知道它的发生会发生。

如果您想尝试一下,它位于https://github.com/jianlin/jasmine-looping-an-it-calling-function-that-does-expect

4

1 回答 1

1

我从来没有使用过 Jasmine,所以我不知道其中大部分是做什么的,我绝对不知道是做什么it的,但这似乎是 Javascript 中常见的关闭问题。

这通常发生在异步事物(如event处理程序)尝试访问i其回调中的迭代器()时。到那时,循环已经完成并且i是最后一个值。使用闭包,i可以捕获并正确传递 的值。如果it是异步的,您将无法获得console.log您想要的结果顺序 - “HERE”将首先出现,然后是“THERE”。

你可以试试这段代码:

it("should add for " + i, (function(i) {
    return function () {
        checkForSituation(i);
    };
})(i);
于 2013-04-09T04:20:31.910 回答