2017-05-23 31 views
0

所以这是聊天机器人的(剪裁)代码。我想重写sendMessage()函数来回显消息参数。在这种情况下,原始函数运行并在函数的第二行发生错误。显然,模块不会被加载,我不需要它们。这是eventHandler回应正确消息的测试。想法?Sinon stub callFake功能不会取代原有功能

var modules = require('./modules'); 
 
console.log('[tose] Loading modules: ', Object.keys(modules)); 
 
    
 
function eventHandler(channel, type, data, react=()=>{}) { 
 
    switch (type) { 
 
    case 'new_message': 
 
     console.log('[tose][new_message]', channel, 'from:', data.cid, 'message:', data.message); 
 
     if (regexTemplates.testSearch.test(data.message.toLowerCase())) { 
 
     ... 
 
     } else { 
 
     sendMessage(channel, data.cid, data.message); // Basic echo message 
 
     } 
 
     break; 
 
    } 
 
} 
 
    
 
// The function to be stubbed 
 
function sendMessage(channel, cid, message) { 
 
    console.log('[tose][send_message]', channel, 'to:', cid, 'message:', message); 
 
    coms[channel].sendMessage(cid, message); // Getting error here thus not really stubbed 
 
} 
 
    
 
exports.eventHandler = eventHandler; 
 
exports.sendMessage = sendMessage

而且测试:

describe('Tose core', function() { 
 
    describe('Process messages', function() { 
 

 
    before(function() { 
 
     var stub = sinon.stub(tose, 'sendMessage').callsFake(function(channel, cid, message) { 
 
     assert.equal(message, 'Test message'); 
 
     return message 
 
     }); 
 
    }); 
 

 
    after(function() { 
 
     tose.sendMessage.restore(); 
 
    }); 
 

 
    it('should echo messages', function() { 
 
     var data = {message: 'Test message'} 
 
     tose.eventHandler('test', 'new_message', data) 
 
     assert(tose.sendMessage.calledOnce); 
 
    }); 
 

 
    }); 
 
});

回答

0

这里的问题是,当你使用Sinon存根对象的功能,你磕碰那(只有那个)对象的功能。


您的代码(第一码块)是使用sendMessage函数的局部定义。

stubtose对象(在第二码块),则在改变tose对象上的功能sendMessage这就是,而不是函数的局部定义。


有许多不同的方法,你可以接近这一点,其中之一是:

var modules = require('./modules'); 
var functions = { 
    eventHandler: eventHandler, 
    sendMessage: sendMessage, 
}; 
console.log('[tose] Loading modules: ', Object.keys(modules)); 

function eventHandler(channel, type, data, react=()=>{}) { 
    switch (type) { 
    case 'new_message': 
     console.log('[tose][new_message]', channel, 'from:', data.cid, 'message:', data.message); 
     if (regexTemplates.testSearch.test(data.message.toLowerCase())) { 
     ... 
     } else { 
     functions.sendMessage(channel, data.cid, data.message); // Basic echo message 
     } 
     break; 
    } 
} 

// The function to be stubbed 
function sendMessage(channel, cid, message) { 
    console.log('[tose][send_message]', channel, 'to:', cid, 'message:', message); 
    coms[channel].sendMessage(cid, message); // Getting error here thus not really stubbed 
} 

module.exports = functions; 

注:functions不是一个描述性的名称 - 随意改变它的东西是更有意义。