在一个自定义的NodeJS包中,如何对依赖于同一个包中的函数的函数进行unit testing?

我是unit testing的新手。

我正在对自定义NodeJS包中的每个函数执行unit testing。
假设我的包出口function如下,

//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 ... } } 

我想对copyFiles()copyFiles()进行unit testing。 然而, copyFiles()实际上取决于copyFiles() listFiles() 。 为这些函数编写unit testing的最佳做法是什么?

有几个选项,你可以select:

  1. 您可以独立testinglistFiles,然后testingcopyFiles(使用listFiles)
  2. 您可以testinglistFiles,然后testingcopyFiles与一个模拟版本的listFiles以某种方式注入(有几种方法可以做到这一点)
  3. 你只能testingcopyFiles,如果这些testing也覆盖listFiles在100%

我个人build议做1和2的混合。

现在,至于如何做到这一点 – 如果你使用茉莉花,你可以用间谍创build一个嘲弄的function:

为了模拟需要的语句,你可以使用mock-require:

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

在我的一些项目中,作为npm test的一部分,我强制执行100%的覆盖率,并且确保一切都得到广泛的testing。

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