jasmine测试中使用循环的一些误区

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个不同地址的值,而不是之前的指向同一个地址。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章