在package.json中的文件夹内的文件夹上运行测试

the*_*uls 0 unit-testing mocha.js npm package.json

我有一个应用程序,其test命令集如下所示package.json

“ test”:“ mocha --require babel-core / register --watch-extensions js ** / *。test.js”,

不幸的是,我的apps文件夹结构超出了该命令允许的范围。看起来像这样:

app
??? someFolder
    ??? subFolder
        ??? subSubFolder
            ??? fileNeedsToBeTest.js
            ??? fileNeedsToBeTest.test.js
??? anotherFolder
    ??? anotherFileNeedsToBeTest.js
    ??? anotherFileNeedsToBeTest.test.js
Run Code Online (Sandbox Code Playgroud)

问题在于test命令所在的位置,我只能测试其中的内容,anotherFolder但我也需要someFolder/subFolder/subSubFolder测试其中的文件。我不想指定确切的路径,因为我在整个应用程序中都有多个实例。

无论文件在文件夹中有多深,我如何修复test命令以查找*.test.js文件?

Rob*_*obC 5

您的glob模式**/*.test.js应该用双引号("...")引起来,但是,因为它是在JSON中指定的,因此需要使用反斜杠对它们进行转义,即\"...\"

您的test命令应更改为以下内容:

"test": "mocha --require babel-core/register --watch-extensions js \"**/*.test.js\"",
Run Code Online (Sandbox Code Playgroud)

这将找到所有以.test.js项目目录的根结尾的文件,这些文件以许多级别深入。

提示:我假设您的app文件夹位于项目的根目录中,与package.jsonand node_modules目录位于同一级别。如果是这样的情况,那么glob模式**/*.test.js将有可能找到后缀的文件.test.jsnode_modules目录中-这将导致正在运行这些测试的了。为防止这种情况,您可以node_modules按如下所示在全局模式中取反该目录:

"test": "mocha --require babel-core/register --watch-extensions js \"{,!(node_modules)/**/}*.test.js\""
Run Code Online (Sandbox Code Playgroud)

编辑:

针对以下评论:

... {,!(node_modules)/**/}*.test.js部分命令来自哪里?那是什么语法?

Mocha利用node-glob作为其依赖项之一。命令那部分的语法由node-glob定义(...类似于Bash用于globbing / pathname扩展的语法)。

可以在node-glob文档的Glob Primer部分中找到此语法的参考。

用于此方案的特定模式的说明:

让我们细分该模式的相关部分...

             (A) Braced section
              ?
    ??????????????????????
    {,!(node_modules)/**/}*.test.js
     ???????????????????? ??????????
     ?       ?         ?  ?    ?
     ?       ?         ?  ?   (F) filename extension
     ?       ?         ?  ?
     ?       ?         ? (E) Single Globstar
     ?       ?         ?
     ?       ?        (D) Double Globstar
     ?       ?
     ?      (C) Negation section
     ?
    (B) Comma-delimited
Run Code Online (Sandbox Code Playgroud)
  • (A)括号部分:文档将其描述为:

    在解析路径零件样式之前,将支撑部分扩展为一组。括号部分以开头{和结尾},其中有任意多个逗号分隔的部分。括号部分可能包含斜杠字符,因此a{/b/c,bcd}将扩展为a/b/cabcd

  • (B)以逗号分隔

    桁部分用逗号分隔符开始,因为下一个否定部分,(部分年初!),必须出现在另一种模式-它不能是开头。这里没有提供逗号分隔符之前的初始模式。在这种情况下,它仅表示项目目录(或者更具体地讲,package.json是存储目录/当前目录)。实际上,我们可以将模式更改为以下任意一种,我们将获得相同的结果。

    {/,!(node_modules)/**/}*.test.js
     ^
    
    {./,!(node_modules)/**/}*.test.js
     ^^
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,/./分别在逗号分隔符之前添加到了模式中。这与我们可以在html,javascript等中定义资产路径的方式相同。

  • (C)否定部分

    !手段“不匹配这个”“忽略此”。文档将其描述为:

    !(pattern|pattern|pattern) 匹配与提供的任何模式都不匹配的任何内容。

    在我们的方案中,它用于忽略node_modules文件夹。

  • (D)双星

    /**/部分与任意数量的字符匹配,包括/。也许更简单地说,它意味着扫描所有文件和子文件夹,无论扫描到多级。

  • (E)单星

    如果文件名的所有字符以提供的文件名扩展名(F)结尾,则将其匹配。

  • [F)文件扩展名

    匹配所有以.test.js文件扩展名结尾的文件。

  • **更新答案** - 根据您的要求添加了对通配模式的解释。 (2认同)