gpt4 book ai didi

javascript - Sinon stub callFake 函数不替换原始函数

转载 作者:行者123 更新时间:2023-12-01 03:37:43 24 4
gpt4 key购买 nike

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

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 来 stub 对象的函数时,您只是 stub 该对象的函数(并且仅 stub 该对象的函数)。

<小时/>

您的代码(第一个代码块)正在使用 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 不是一个描述性名称 - 请随意将其更改为更有意义的名称。

关于javascript - Sinon stub callFake 函数不替换原始函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com