2017-02-17 7 views
1

Учитывая эту функциюгенераторы Модульное тестирование с `` return` и yield`

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

и этот тест

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

Стамбул, следует сказать, что все ветви покрыты, но на самом деле это охватывает 3 из 4. Удаление return устраняет проблему.

  • return и yield вместе антипаттерн?
  • Это ошибка?

Для контекста, Бабель компилирует этот как

"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

Как вы выполняете аннотирование кода с отслеживанием покрытия? – loganfsmyth

+2

В коде компиляции вы видите, что 'case 3' никогда не был достигнут. Вы должны быть обеспокоены только охватом кода кода, который вы пишете, а не сгенерированного кода. –

ответ

-1

Быстрый пример из консоли:

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} 

Генератор имеет более 1 состояние.

Смежные вопросы