2015-11-02 108 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一起使用的每个作品:) –