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