2010-12-10 2 views
7

Я пишу серверное приложение с node.js и хотел бы включить модульные тесты. Одна вещь, с которой я борюсь, - это хороший способ модульного теста EventEmitter и setInterval/setTimoutСобытие, связанное с тестированием событий javascript

Какие параметры у меня есть для тестирования асинхронного сервера на стороне javascript?

Я знаю, что могу просто подключить другого слушателя к EventEmitter, который является функцией тестирования, но тогда как я могу гарантировать, что функция тестирования когда-либо запускается? часть единичного теста состоит в том, чтобы гарантировать, что каждая часть тестовых прогонов.

Я мог бы использовать setTimeout самостоятельно, но это похоже на хакерское решение.

Если это помогает, вот какой примерный код, который я пытаюсь проверить.

... 
function init(param) { 
    ... 
    // run update entities periodically 
    setInterval(this._updateEntities.bind(this, param.containerFull), 
     1000/param.fps); 
    ... 
} 
... 
EntityUpdater.prototype = { 
    ... 
    "_updateEntities": function updateEntitiesfunc(fn) { 
     this._tickEmitter.emit(
      "tick", 
      new dataContainer.DataContainer(this.getEntityCount()) 
      .on(
       "full", fn.bind(this) 
      ) 
     ); 
    }, 
    ... 
} 
... 

(Испустите вызовет событие)

[Редактировать]

Я начал читать некоторые из тестов EvevntEmitter на https://github.com/ry/node/tree/master/test/simple, и это помогает мне увидеть, как идти об этом.

+0

Вы взглянули на это сообщение в блоге? http://debuggable.com/posts/unit-testing-with-node-js:4b647d40-34e4-435a-a880-3b04cbdd56cb – Tmdean

+0

Да, я читал блог, он полезен, но только охватывает несколько моментов. Я только что заметил, что тест не будет действовать, пока цикл не закончен. Это все еще оставляет простой одноразовый setTimeout и одноразовые события. – Raynos

+0

Я только сейчас заметил, что выходной блок относится к тесту, а не к серверу. Его способ запустить блок кода после завершения всех асинхронных действий – Raynos

ответ

3

Лично мне помогло больше всего читать тесты для node.js (я читал только о половине из них).

Это дало мне хорошее ощущение, как проверить асинхронный код.

Благодаря @tmdean для указания другого примера тестирования асинхронного кода.

3

Я бы порекомендовал вам проверить Jasmine для ваших тестов. Он построен для запуска тестов за пределами среды браузера, и он заглушает такие вызовы, как setTimeout, предоставляя вам поддельные часы, с помощью которых вы можете перемещать время в свободное время для тестирования любых связанных с временем событий.

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