2015-08-01 4 views
1

Я создаю небольшой проект в 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? 
*/ 

Есть ли лучше способ ввода/замены функции в моем модуле для целей тестирования?

ответ

1

Я использовал Mockery для этой цели

И для тестирования HTTP вызовов Nock

Они оба предлагают намного более чистый подход

1

Это называется «издевается» или «гася». Это обычная необходимость во время тестирования, и есть множество библиотек. Возможно, самым популярным является Sinon.

С Sinon вы можете сделать что-то вроде var stub = sinon.stub(request, [methodName]).returns(false) (или любое другое возвращаемое значение).Вы также можете делать такие вещи, как stub.expects(42), чтобы утверждать, что функция получает это в качестве параметра при вызове.

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

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