繁体   English   中英

Sinon存根callFake函数未替换原始函数

[英]Sinon stub callFake function not replacing original function

这是聊天机器人的(片段)代码。 我想重写sendMessage()函数以仅回显message参数。 在这种情况下,原始函数将运行并在函数的第二行给出错误。 显然,模块没有被加载,我不需要它们。 这是对eventHandler回显正确消息的测试。 有想法吗?

 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); }); }); }); 

这里的问题是,当您使用Sinon存根一个对象的功能时,您正在存根那个(并且只有那个)对象的功能。


您的代码(第一个代码块)正在使用sendMessage函数的本地定义。

stub tose对象时(在第二个代码块中),您将更改在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不是描述性名称-随时将其更改为更有意义的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM