2017-02-17 1 views
1

Compte tenu de cette fonctiongénérateurs de tests unitaires avec `return` et` yield`

function* backflip(query) { 
    return yield 123; 
} 

Et ce test

describe('backflip',() => 
    it('should do that ^',() => 
    let handlerInstance = handler(); 
    expect(handlerInstance.next().value).to.equal(123); 
    expect(handlerInstance.next().done).to.equal(true); 
); 
); 

Istanbul, devraient dire toutes les branches sont couvertes, mais en fait cela couvre 3 sur 4. Suppression return résout le problème.

  • Est-ce que return et yield forment ensemble un anti-motif?
  • Est-ce un bug?

Pour le contexte, Babel compile ce que

"use strict"; 

var _marked = [backflip].map(regeneratorRuntime.mark); 

function backflip(query) { 
    return regeneratorRuntime.wrap(function backflip$(_context) { 
    while (1) { 
     switch (_context.prev = _context.next) { 
     case 0: 
      _context.next = 2; 
      return 123; 

     case 2: 
      return _context.abrupt("return", _context.sent); 

     case 3: 
     case "end": 
      return _context.stop(); 
     } 
    } 
    }, _marked[0], this); 
} 
+0

Comment courez-vous l'annotation du code avec le suivi de la couverture? – loganfsmyth

+2

Vous pouvez voir dans le code de compilation que 'case 3' n'est jamais atteint. Vous devriez seulement vous soucier de la couverture de code du code que vous écrivez, pas du code généré. –

Répondre

-1

exemple rapide de la console:

var g = function* backflip(query) { 
    yield 123; return 0; 
}; 
undefined 
var a = g(); 
undefined 
a.next() 
Object {value: 123, done: false} 
a.next() 
Object {value: 0, done: true} 
a.next() 
Object {value: undefined, done: true} 

générateur a 1 plus état.