在自定义NodeJS包中,如何对依赖于同一包中的函数的函数执行单元测试?

时间:2017-09-08 09:21:43

标签: 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 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
        ...
    }
}

我想对listFiles()copyFiles()进行单元测试;但是,copyFiles()实际上取决于listFiles()。为这些函数编写单元测试的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

您可以选择几个选项:

  1. 您可以单独测试listFiles,然后测试copyFiles(使用listFiles)
  2. 您可以测试listFiles,然后使用以某种方式注入的模拟版本的listFiles来测试copyFiles(有几种方法可以做到这一点)
  3. 只有当这些测试还涵盖100%
  4. 中的listFiles时,才可以测试copyFiles

    我个人建议混合1和2。

    现在,关于如何做到这一点 - 如果你是使用Jasmine你可以用间谍创建一个模拟函数:

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

    我总是建议使用像nyc或istanbul这样的覆盖工具:

    在我的一些项目中,我强制实施100%覆盖率作为npm test的一部分,并且它可以很好地确保所有内容都经过广泛测试。

    提示:如果其他函数中的每一个都在自己的文件中,那么模拟其他函数使用的函数会更容易,但它不是唯一的方法。