Node.js 在自定义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

我是单元测试的新手

我正在对自定义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 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()
。为这些函数编写单元测试的最佳实践是什么?

您可以选择的选项很少:

  • 您可以单独测试listFiles,然后测试copyFiles(使用listFiles)
  • 您可以测试listFiles,然后以某种方式注入listFiles的模拟版本来测试copyFiles(有几种方法可以做到这一点)
  • 只有当这些测试100%覆盖列表文件时,您才能测试CopyFile
  • 我个人建议混合使用1和2

    现在,关于如何做到这一点-如果您使用Jasmine,您可以使用spies创建模拟函数:

    要模拟require语句,可以使用mock require:

    我总是建议使用像纽约或伊斯坦布尔这样的覆盖工具:

    在我的一些项目中,作为
    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}