Заменить внутренние функции на testdouble.js?
Это возможно td.replace
внутренняя функция в модуле node.js при тестировании с testdouble.js?
Внутренняя функция состоит из вызова БД, поэтому я не хочу ее тестировать. Однако я хочу проверить, что эта функция получила ожидаемые параметры.
Например, учитывая модуль node.js:
module.exports = { record: recordEvent }
recordEvent = (event) =>
var dbModel = map(event);
persist(dbModel);
var map = (event) =>
// some code that transforms event to the db specific representation (testable)
var persist = (model) =>
// some SQL insert/update code here (not testable)
И следующий тест, который проверяет, сохраняется ли, получает правильные параметры:
recorder = require('event_recorder')
describe 'Event recorder module', ->
it 'converts the event to a db model', ->
var event = {...// mock event };
var model = {...// mock model of the event };
var persist = td.replace(recorder, 'persist')
td.when(persist(model)).thenReturn(true)
result = recorder.record(event)
expected = true;
result.should.be.equal(expected)
Однако тест выдает ошибку:
td.replace - свойство "persist" не найдено
Я понимаю, почему он имеет эту ошибку, потому что метод persist не является публичным. Как еще можно добиться этого в testdouble?
1 ответ
Один из вариантов, как вы намекаете, состоит в том, чтобы сделать persist
метод публичный. Другой вариант будет для persist
принять или использовать другую функцию для выполнения запроса SQL, и вместо этого заглушить эту функцию:
var executeQuery = td.function()
recorder.recordEvent(event, executeQuery)
td.verify(executeQuery('UPDATE ...'))