2015-03-05 9 views
7

Я не хочу читать код в течение нескольких часов, чтобы найти соответствующую часть, но мне любопытно, как жасмин выполняет свои часы. Интересно, что он может протестировать асинхронный код с кодом проверки синхронизации. AFAIK, с текущим node.js, который поддерживает ES5, это невозможно (асинхронные функции определены в ES7). Разбирает ли он код js с чем-то вроде estraverse и строит асинхронный тест из синхронизации?Как работают часы жасмина?

Просто пример того, что я говорю:

it("can test async code with sync testing code", function() { 
    jasmine.clock().install(); 

    var i = 0; 
    var asyncIncrease = function() { 
     setTimeout(function() { 
      ++i; 
     }, 1); 
    }; 

    expect(i).toBe(0); 
    asyncIncrease(); 
    expect(i).toBe(0); 
    jasmine.clock().tick(2); 
    expect(i).toBe(1); 

    jasmine.clock().uninstall(); 
}); 

В данном случае expect(i).toBe(1); должен быть в функции обратного вызова.

ответ

10

Функция install() фактически заменяет setTimeout с функцией макета, которую жасмин дает вам больше контроля над. Это делает его синхронным, потому что фактическое ожидание не выполняется. Вместо этого вы вручную переместите его вперед с помощью функции tick(), которая также является синхронной.

См исходный код: https://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

Предположим, вы имели функцию, которая внутренне установить тайм-аут 5 часов. Жасмин просто заменяет вызов setTimeout так, что обратный вызов будет вызываться, когда вы вызываете tick(), чтобы внутренний счетчик достиг или превысил отметку в 5 часов. Это очень просто!

+0

Так что это не будет работать с помощью реального асинхронного кода, например. по db-соединению? – inf3rno

+2

@ inf3rno Для ajax вы хотели бы либо высмеять вызов ajax (предположим, что сервер работает), либо для тестов интеграции, фактически пусть это будет асинхронно. – m59

+0

Хорошо. Я работаю над системой async для ES5, поэтому я спросил. Благодаря! :-) – inf3rno

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

  • Нет связанных вопросов^_^