用testdouble.js替换内部函数?

时间:2017-06-13 23:30:04

标签: node.js unit-testing testdoublejs

使用testdouble.js进行测试时,是否可以td.replace 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)

以下测试,检查持久性是否得到正确的参数:

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 - 未找到“持久”属性

我理解为什么会出现这个错误,因为持久化方法不公开。我怎样才能在testdouble中实现这个目标?

1 个答案:

答案 0 :(得分:1)

正如您所暗示的那样,一个选项是公开persist方法。另一个选择是persist接受或使用另一个函数来执行SQL查询,而 函数的存根

var executeQuery = td.function()

recorder.recordEvent(event, executeQuery)

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