在一个自定义的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:
- 您可以独立testinglistFiles,然后testingcopyFiles(使用listFiles)
- 您可以testinglistFiles,然后testingcopyFiles与一个模拟版本的listFiles以某种方式注入(有几种方法可以做到这一点)
- 你只能testingcopyFiles,如果这些testing也覆盖listFiles在100%
我个人build议做1和2的混合。
现在,至于如何做到这一点 – 如果你使用茉莉花,你可以用间谍创build一个嘲弄的function:
为了模拟需要的语句,你可以使用mock-require:
我总是推荐使用像nyc或istanbul这样的覆盖工具:
在我的一些项目中,作为npm test
的一部分,我强制执行100%的覆盖率,并且确保一切都得到广泛的testing。
提示:如果其他函数中的每一个函数都在自己的文件中,那么将会更容易地模仿其他函数使用的函数,但这不是唯一的方法。