Я создаю небольшой проект в nodejs, который является оберткой для API. Я пишу некоторые модульные тесты, используя nodeunit, и вам нужно вводить в модуль различные функции mock (например, функцию, которая имитирует выполнение HTTP-запроса на сервере и выводит различные ответы для проверки моего кода).Заменить функции в модуле nodejs с помощью макетных функций
Вопрос, который у меня есть, заключается в том, как я вставляю эти функции в свой модуль?
Я определил два метода, которые теоретически должны работать следующим образом:
Метод 1
переименуйте папки модулей Я хотел бы заменить и добавить новую папку, содержащую код, который я хотел бы вводить, например:
./node_modules/request -> ./node_modules/request.tmp
./tests/myRandomFunction -> ./node_modules/request
После выполнения тестов я бы тогда сделать наоборот:
./node_modules/request -> ./tests/myRandomFunction
./node_modules/request.tmp -> ./node_modules/request
Это кажется довольно взломанным и не то, что я хотел бы попробовать, хотя он теоретически должен работать.
Способ 2
Это мой предпочтительный метод использует мои модули инициализацию. Мой модуль принимает объект JSON, который может содержать различные варианты следующим образом:
var module = require('./module')({
option1: '',
option2: '',
...
});
Я планирую добавить ключ к этому JSON объект под названием «_testing» со значением объекта JSON, содержащего различные функции, например:
var module = require('./module')({
_testing: {
request: function() {return false;}
}
});
В моем модуле я мог бы сделать следующее:
- Если this._testing существует и является объектом JSON
- Цикл по this._testing
- Для каждого ключа в this._testing
- Заменить функцию с тем же именем в качестве ключа с его значением, например
eval(''+key+' = this._testing.'+key) //eval('request = this._testing.request')
/*
eval can be dangerous I should probably perform some validation for example is key a function we want to be replaced? Can I check if nodeunit is testing my module and if it isn't don't do anything?
*/
Есть ли лучше способ ввода/замены функции в моем модуле для целей тестирования?