如果使用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
答案 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);