Javascript Sinon存根调用伪函数不替换原始函数

Javascript Sinon存根调用伪函数不替换原始函数,javascript,mocha.js,sinon,Javascript,Mocha.js,Sinon,这是聊天机器人的(截取的)代码。我想重写sendMessage()函数,只回显消息参数。在这种情况下,原始函数将运行,并在函数的第2行给出一个错误。显然,模块没有加载,我也不需要加载。这是eventHandler回显正确消息的测试。想法 var模块=需要('./模块'); log(“[tose]加载模块:”,Object.keys(模块)); 函数eventHandler(通道、类型、数据、反应=()=>{}){ 开关(类型){ 案例“新信息”: log(“[tose][new_message

这是聊天机器人的(截取的)代码。我想重写sendMessage()函数,只回显消息参数。在这种情况下,原始函数将运行,并在函数的第2行给出一个错误。显然,模块没有加载,我也不需要加载。这是eventHandler回显正确消息的测试。想法

var模块=需要('./模块');
log(“[tose]加载模块:”,Object.keys(模块));
函数eventHandler(通道、类型、数据、反应=()=>{}){
开关(类型){
案例“新信息”:
log(“[tose][new_message]”,频道,“from:”,data.cid,“message:”,data.message);
if(regexTemplates.testSearch.test(data.message.toLowerCase()){
...
}否则{
sendMessage(通道,data.cid,data.message);//基本回显消息
}
打破
}
}
//要存根的函数
功能发送消息(通道、cid、消息){
日志(“[tose][send_message]”,频道,“to:”,cid,“message:”,message);
coms[channel].sendMessage(cid,message);//在此处获取错误,因此没有真正的存根
}
exports.eventHandler=eventHandler;

exports.sendMessage=sendMessage
这里的问题是,当您使用
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
不是一个描述性名称-请随意将其更改为更有意义的名称。

这里的问题是,当您使用
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;

注意:
函数
不是一个描述性名称-请随意将其更改为更有意义的名称