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


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