Jasmine是一个我很喜欢的一个javascript测试框架,但今天发现在测试中使用for会有一个很大的陷阱。
首先我们看一段代码:
describe('Trap of Loop Test', function() {
var list = [0, 1, 2, 3, 4]
for (var i = 0; i < 5; i++) {
it('should get the correct int', function() {
var intNum = list[i]
expect(intNum).toBe(i)
})
}
})
这段代码会进行5个测试,期望的是list中的元素下标与内容相等;然后,全没通过,蹦出了5个错误,都是:
Chrome 29.0 (Mac) Trap of Loop Test should get the correct int FAILED
Expected undefined to be 5.
Error: Expected undefined to be 5.
按照这提示,测试中的intNum都是undefined,i都是5;这。。。似乎有点不科学。
其实这个jasmine框架的原理有关。其实,it()这方法只是把一个测试描述和一段测试方法(即其两个参数)放到框架的测试数组里;所以,describe()里的代码(包括里面的for)执行完了,才会执行框架的测试数组;这就是为什么i会是5。
知道这原理后,我们就能跳过这陷阱了:
describe('Trap of Loop Test', function() {
var list = [0, 1, 2, 3, 4]
var testFunc = function(i) {
it('should get the correct int', function() {
var intNum = list[i]
expect(intNum).toBe(i)
})
}
for (var i = 0; i < 5; i++) {
testFunc(i)
}
})
专门写一个testFunc方法来存放要循环的测试方法,且把要用到的值通过参数传进去;这样最后运行测试数组时的i分别是5个不同地址的值,而不是之前的指向同一个地址。