如何在测试中对其他模块调用的模块中的函数进行桩/模拟?

如何在测试中对其他模块调用的模块中的函数进行桩/模拟?

问题描述:

我想在模块X中测试一个函数。它是一个相当复杂的函数。在这个函数中,我在模块Y中导入了一个调用第三方服务的函数。如果我对模块X的测试不导入模块Y,如何在模块Y中存储此第三方服务?如何在测试中对其他模块调用的模块中的函数进行桩/模拟?

你可以像嘲弄项目沿require缝补丁:

如果你已经尝试用Node.js的嘲笑工作,你毫无疑问 发现,它不是那么容易得到你的模拟连接在Node的模块加载系统的 面上。当您的源测试 通过require引入其依赖关系时,您希望提供您的模拟 而不是原始模块,以启用代码的真实单元测试 。

https://github.com/mfncooper/mockery

比方说,你的模块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中允许你无需任何依赖它是完美的单元测试嘲笑什么。希望能帮助到你。