2015-11-02 48 views
1

我正在研究Gulp插件,允許使用用英語以外的語言編寫的保留字編寫JavaScript代碼 - 它的主要做法是翻譯,但它不是我所關心的。摩卡咖啡單元測試和斷言`for`loop

與摩卡和Should.js編寫單元測試我發現我不能使用for循環這樣的:

describe('Proper translating JavaScript PL into JavaScript', function() { 
    var asserts = [ 
     { 
      passed: '(tak || nie) && (prawda || fałsz)', 
      expected: '(true || false) && (true || false)' 
     }, 
     { 
      passed: 'jeśli (tak) { jeżeli (prawda) {}}', 
      expected: 'if (true) { if (true) {}}' 
     }, 
     { 
      passed: 'przez (zm i = 1; i <= 3; console.log(i++));', 
      expected: 'for (var i = 1; i <= 3; console.log(i++));' 
     }, 
     { 
      passed: 'zm sum = funkcja (a, b) { zwróć a + b; };', 
      expected: 'var sum = function (a, b) { return a + b; };' 
     }, 
     { 
      passed: 'generator snowball() { zm a = 1; dostarcz a++; }', 
      expected: 'function* snowball() { var a = 1; yield a++; }' 
     }, 
     { 
      passed: 'lol', 
      expected: 'zap' 
     } 
    ]; 

    for (var i = 0, l = asserts.length; i < l; i++) { 
     var assert = asserts[i]; 
     var desc = 'should turn `' + assert.passed + '` into `' + assert.expected + '`'; 
     it(desc, function (done) { 
      tester(assert.passed, assert.expected, done); 
     }); 
    } 
}); 

當我做這樣的事情上面,一個錯誤表述爲failing之多倍數量的斷言。

enter image description here

正如你看到的,我們得到了6次失敗雖然有正確2.此外,其中只有一個是這裏提到。

我不想翻番描述類似下面的語句:

describe('Proper translating JavaScript PL into JavaScript', function() { 
    var asserts = [ 
     { 
      passed: '(tak || nie) && (prawda || fałsz)', 
      expected: '(true || false) && (true || false)' 
     }, 
     { 
      passed: 'jeśli (tak) { jeżeli (prawda) {}}', 
      expected: 'if (true) { if (true) {}}' 
     }, 
     { 
      passed: 'przez (zm i = 1; i <= 3; console.log(i++));', 
      expected: 'for (var i = 1; i <= 3; console.log(i++));' 
     }, 
     { 
      passed: 'zm sum = funkcja (a, b) { zwróć a + b; };', 
      expected: 'var sum = function (a, b) { return a + b; };' 
     }, 
     { 
      passed: 'generator snowball() { zm a = 1; dostarcz a++; }', 
      expected: 'function* snowball() { var a = 1; yield a++; }' 
     }, 
     { 
      passed: 'lol', 
      expected: 'zap' 
     } 
    ]; 

    it('should be kicking 1', function (done) { 
     tester(asserts[0].passed, asserts[0].expected, done); 
    }); 
    it('should be kicking 2', function (done) { 
     tester(asserts[1].passed, asserts[1].expected, done); 
    }); 
    it('should be kicking 3', function (done) { 
     tester(asserts[2].passed, asserts[2].expected, done); 
    }); 
    it('should be kicking 4', function (done) { 
     tester(asserts[3].passed, asserts[3].expected, done); 
    }); 
    it('should be kicking 5', function (done) { 
     tester(asserts[4].passed, asserts[4].expected, done); 
    }); 
    it('should be kicking 6', function (done) { 
     tester(asserts[5].passed, asserts[5].expected, done); 
    }); 
}); 

這些should be kicking N並不重要 - 我去過懶得寫東西,如:

it('should turn `(tak || nie) && (prawda || fałsz)` into `(true || false) && (true || false)`', function (done) { 
    tester('(tak || nie) && (prawda || fałsz)', '(true || false) && (true || false)', done); 
}); 

無論如何,做獨立斷言測試就OK了。

enter image description here

第5次測試在這兩種情況下取​​得成功,我們不看他們都在這裏。 我們關注的測試是這6個放在asserts

做分離測試it()事情正確。 在for循環中做測試,一次失敗使得asserts.length失敗,另外一次失敗使其他未見。

回答

0

包裹你的閉合循環內的代碼:

for (var i = 0, l = asserts.length; i < l; i++) { 
    (function(n) { 
    var assert = asserts[n]; 
    var desc = 'should turn `' + assert.passed + '` into `' + assert.expected + '`'; 
    it(desc, function (done) { 
     tester(assert.passed, assert.expected, done); 
    }); 
    })(i); 
} 

或者使用asserts.forEach

JS Bin:https://jsbin.com/kinuvedisa/edit?html,js,output

+0

Thx,IIFE碰到了現場。 forEach沒有比這更好的了,就像'for' –

+0

forEach在我的例子中所做的那樣,如果你將代碼改回for循環,它就不能同時滿足兩個規範。但很高興你的工作! – Lee

+0

是的,對於與IIFE一起使用的每個作品:) –