如何在测试中对其他模块调用的模块中的函数进行桩/模拟?
问题描述:
我想在模块X中测试一个函数。它是一个相当复杂的函数。在这个函数中,我在模块Y中导入了一个调用第三方服务的函数。如果我对模块X的测试不导入模块Y,如何在模块Y中存储此第三方服务?如何在测试中对其他模块调用的模块中的函数进行桩/模拟?
答
你可以像嘲弄项目沿require
缝补丁:
如果你已经尝试用Node.js的嘲笑工作,你毫无疑问 发现,它不是那么容易得到你的模拟连接在Node的模块加载系统的 面上。当您的源测试 通过require引入其依赖关系时,您希望提供您的模拟 而不是原始模块,以启用代码的真实单元测试 。
答
比方说,你的模块X
返回由Y
执行的操作的结果,我们可以说,X
如下:
const y = require ('y.js');
xWork() {
return y.doWork().result;
}
在这里,您可以更新X
注入Y
像这样:
xWork (y) {
return y.doWork().result;
}
从那里,你在你的测试,你可以生成一个Y
模拟可以注入这样的:
yMock = {
doWork:() => {
return { result: 'mockedResult' };
}
};
x.xWork(yMock); // call x with y mock
JavaScript中允许你无需任何依赖它是完美的单元测试嘲笑什么。希望能帮助到你。