Заменить внутренние функции на 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 ...'))
Другие вопросы по тегам