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

时间:2017-05-23 16:39:29

标签: javascript mocha sinon

所以这是聊天机器人的(剪切)代码。我想覆盖sendMessage()函数来回显消息参数。在这种情况下,原始函数运行并在函数的第2行给出错误。显然,模块没有加载,我不需要它们。这是对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);
    });

  });
});

1 个答案:

答案 0 :(得分:1)

这里的问题是,当你使用Sinon来存根对象的功能时,你就会对那个(并且只有那个)对象的功能进行存根。

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

当您stub tose对象(在第二个代码块中)时,您正在更改sendMessage对象上的tose函数,而不是本地定义功能。

有许多不同的方法可以解决这个问题,其中之一是:

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不是一个描述性名称 - 随意将其更改为更有意义的内容。