Node.js 用testdouble.js替换内部函数?

Node.js 用testdouble.js替换内部函数?,node.js,unit-testing,testdoublejs,Node.js,Unit Testing,Testdoublejs,使用测试时,是否可以替换node.js模块中的内部函数 内部函数由一个DB调用组成,所以我不想测试它。但是,我确实想测试这个函数是否收到了预期的参数 例如,给定node.js模块: module.exports = { record: recordEvent } recordEvent = (event) => var dbModel = map(event); persist(dbModel); var map = (event) => // some

使用测试时,是否可以替换node.js模块中的内部函数

内部函数由一个DB调用组成,所以我不想测试它。但是,我确实想测试这个函数是否收到了预期的参数

例如,给定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)
下面的测试将检查persist是否获得正确的参数:

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中,我还可以如何实现这一点呢?

正如您所暗示的,有一个选项是将
持久化
方法公开。另一个选项是让
persist
接受或使用另一个函数来执行SQL查询,并将该函数存根:

var executeQuery = td.function()

recorder.recordEvent(event, executeQuery)

td.verify(executeQuery('UPDATE ...'))