Node.js 在自定义NodeJS包中,如何对依赖于同一包中的函数的函数执行单元测试?
我是单元测试的新手 我正在对自定义NodeJS包中的每个函数执行单元测试。Node.js 在自定义NodeJS包中,如何对依赖于同一包中的函数的函数执行单元测试?,node.js,unit-testing,Node.js,Unit Testing,我是单元测试的新手 我正在对自定义NodeJS包中的每个函数执行单元测试。 假设我的包导出功能如下所示 //my-package.js module.exports = { listFiles, copyFiles } /** * @return <list> a list of files under src_dir */ function listFiles(src_dir){ //stat all files under src_dir and m
假设我的包导出功能如下所示
//my-package.js
module.exports = {
listFiles,
copyFiles
}
/**
* @return <list> a list of files under src_dir
*/
function listFiles(src_dir){
//stat all files under src_dir and make a list containing all file names
...
}
/**
* @param [allowed_ext] a list of file extensions
*/
function copyFiles(src_dir, dst_dir, allowed_ext = []){
//filter files under src_dir according to allowed_ext
var files = listFiles(src_dir).filter(function(){...})
for(var a_file of files){
//other operations on each single file
...
}
}
//my-package.js
module.exports={
列表文件,
复制文件
}
/**
*@返回src_dir下的文件列表
*/
函数列表文件(src_dir){
//统计src_dir下的所有文件,并列出包含所有文件名的列表
...
}
/**
*@param[allowed_ext]文件扩展名列表
*/
函数copyFiles(src_dir、dst_dir、allowed_ext=[])){
//根据允许的\u ext筛选src\u dir下的文件
var files=listFiles(src_dir).filter(函数(){…})
for(var a_文件){
//每个文件上的其他操作
...
}
}
我想对
listFiles()
和copyFiles()
进行单元测试;但是,copyFiles()
实际上取决于listFiles()
。为这些函数编写单元测试的最佳实践是什么?您可以选择的选项很少:
npm测试的一部分,我强制执行100%的覆盖率,并且它可以很好地确保所有内容都经过广泛测试
提示:如果其他函数使用的函数都在自己的文件中,那么模拟这些函数会更容易,但这不是唯一的方法。您可以选择的选项很少:
您可以单独测试listFiles,然后测试copyFiles(使用listFiles)
您可以测试listFiles,然后以某种方式注入listFiles的模拟版本来测试copyFiles(有几种方法可以做到这一点)
只有当这些测试100%覆盖列表文件时,您才能测试CopyFile
我个人建议混合使用1和2
现在,关于如何做到这一点-如果您使用Jasmine,您可以使用spies创建模拟函数:
要模拟require语句,可以使用mock require:
我总是建议使用像纽约或伊斯坦布尔这样的覆盖工具:
在我的一些项目中,作为npm测试的一部分,我强制执行100%的覆盖率,并且它可以很好地确保所有内容都经过广泛测试
提示:如果其他函数都在自己的文件中,那么模拟其他函数使用的函数会更容易,但这不是唯一的方法。我正在使用sinon.stub(require('my-package'),'listFiles')
模拟listFiles()
来测试copyFiles()
;但是,sinon.stub
仅影响导出的对象,而copyFiles()
中的listFiles
的引用仍然指向原始的listFiles()
。按照以下方式重写模块导出,并在copyFiles()
中使用myModule.listFiles()
?const myModule=module.exports={listFiles,copyFiles}
我正在使用sinon.stub(require('my-package'),'listFiles')
模拟listFiles()
进行测试copyFiles()
;但是,sinon.stub
仅影响导出的对象,而copyFiles()
中的listFiles
的引用仍然指向原始的listFiles()
。以以下方式重写模块导出并在copyFiles()
中使用myModule.listFiles()
是否是一种良好的做法?const myModule=module.exports={listFiles,copyFiles}