为什么在Jasmine,我们不能把期望放在外面的功能?

时间:2013-04-09 04:12:53

标签: javascript jasmine

如果使用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不能放在像这样的外部函数中,如果我需要在函数中添加许多步骤,可以在Jasmine中做什么?

作为旁注,有时在JavaScript中,我觉得开发了一种全新的语言,你通常做的事情将无法工作 - 并且想知道可以做些什么来防止这类事情的发生,没有知道它会发生。

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

1 个答案:

答案 0 :(得分:1)

我从来没有使用Jasmine,所以我不知道大部分内容是什么,我绝对不知道it做了什么,但这似乎是Javascript中常见的闭包问题。 / p>

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

您可以尝试以下代码:

it("should add for " + i, (function(i) {
    return function () {
        checkForSituation(i);
    };
})(i);