gpt4 book ai didi

node.js - 为什么我不能用 sinon 正确地 stub twilio 库?

转载 作者:搜寻专家 更新时间:2023-11-01 00:35:46 29 4
gpt4 key购买 nike

在我的代码中,我有:

function handleMessage() {
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
let recordings = twilio.recordings(foundConference.RecordingSid);
console.log('recordings', recordings);
return recordings.remove();
}

在我的 stub 中,我有:

const sinon = require('sinon');
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);

exports.twilioRecordings = () => {
console.log('about to stub', twilio.recordings);
sinon.stub(twilio, 'recordings').returns('here');
console.log('finished stub', twilio.recordings);

return;
};

但是,它实际上并没有创建 stub 函数。它仍然使用原始的 recordings 功能。我做错了什么?

最佳答案

Twilio npm package returns a function which creates a new object on every call ,它是 not a singleton .因此,您 stub 的 twilio 实例仅限于测试。

还有 twilio.recordings(和所有其他属性一样)is defined through the getter function in prototype , 所以他们是 read only :

Object.defineProperty(Twilio.prototype,
'recordings', {
get: function() {
return this.api.account.recordings;
}
});

因此, stub 实际的 twilio 实例没有任何效果。除非你change the instance's prototype ,但我认为仅进行单元测试不值得这样做。

我建议您重构代码,将 twilio 初始化放入单独的方法中:

function getTwilio() {
return require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
}

接下来您的 hangleMessage 将如下所示:

function handleMessage() {
const twilio = this.getTwilio();
const recordings = twilio.recordings(...);
...
}

接下来,在您的测试中,您可以 stub getTwilio() 以返回 stub :

const twilioStub = {
recordings: sinon.stub(),
remove: sinon.stub()
}
sinon.stub(myAwesomeModule, 'getTwilio').returns(twilioStub);

您也可以考虑使用 mock-require包裹:

const sinon = require('sinon');
const mock = require('mock-require');
mock('twilio', () => ({
recordings: sinon.stub(),
}));

在这里is a question about how-to mock dependencies ,可能还有其他有用的库来 stub 所需的模块。

希望对您有所帮助。

关于node.js - 为什么我不能用 sinon 正确地 stub twilio 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708944/

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