Mocha: 递归测试时,选项按模式排除某些文件

创建于 2015-03-04  ·  71评论  ·  资料来源: mochajs/mocha

我希望能够提供排除模式,以便我只能测试与测试文件模式匹配的文件。 只要数据文件遵循合理的模式,这将允许它们与测试文件共存。

我认为这只是提供一个在glob中设置ignore选项的选项。

有什么想法吗? 如果您愿意,我可以很快为其提供PR。

feature good-first-issue help wanted usability

最有用的评论

image

所有71条评论

您最好制作两个并行目录,一个用于测试,另一个用于
用于数据文件。 那就是我所做的。
上午04.03.2015 15:52 schrieb“凯尔·戴维斯(Kyle P Davis)” [email protected]

我希望能够提供排除模式,以便我可以
仅匹配我的测试文件格式的测试文件。 这将允许数据
与测试文件共存的文件,只要它们遵循合理
模式。

我认为这只是提供设置忽略选项的选项
在全球。

有什么想法吗? 如果您愿意,我可以很快为其提供PR。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/mochajs/mocha/issues/1577。

我可以(过去也可以),但我现在不想再这样做了,因为我已经意识到全局忽略就在那里。

添加命令行参数来设置glob ignore选项应该非常容易。 我只是想发表想法,并先进行一些讨论。

对我为此创建公关有任何异议吗?

我也只需要这个,惊讶地发现摩卡咖啡还没有它。 我认为这将是一个很大的补充。 我们的测试文件夹中有一个“ testApp”,专门用于测试。 我们不希望Mocha尝试在该文件夹中运行测试。 能够仅在我们的mocha.opts文件中添加排除项以排除该特定路径,而不必显式包括我们拥有的所有其他测试子文件夹,将是很好的。

虽然我们可以将testApp移出,但它确实无法在存储库中放置任何其他内容,并且相对路径指向test文件夹中的某些文件。

我认为这将是一个很好的补充。 当然不是很关键,但是很有帮助。

@KylePDavis @toddbluhm

如果我需要这个,我想我可能只是

$ mocha $(find test/ ! -path '*testApp*')

因此,我对这个想法并不感到兴奋。 我甚recursiveMakefileGruntfile.jsgulpfile.js来实现同一目的

我认为@boneskull很有意思-这已经可以通过多种方式实现。 这还不包括您可以构造目录来完全避免这种情况的事实。 例如,给定此结构:

$ tree .
.
└── spec
    ├── fixtures
    ├── integration
    └── unit

4 directories, 0 files

您只需更新package.json即可运行npm test

  "scripts": {
    "test": "mocha spec/unit spec/integration"
  }

或具有如下结构:

$ tree .
.
└── src
    └── models
        ├── user.js
        └── userSpec.js

2 directories, 2 files

您可以以类似于@boneskull的示例的方式运行规范(这只会运行包含Spec

  "scripts": {
    "test": "mocha $(find src -name '*Spec.js')"
  }

编辑:固定:)

@danielstjules我认为实际上它将以Spec的名义命中任何目录。 也许您想要-name '*.spec.js'

是的,你是对的! Brainfart。 感谢您指出了这一点。

示例的固定命令:

  "scripts": {
    "test": "mocha $(find src -name '*Spec.js')"
  }

我认为此功能仍有一个有效的用例:我倾向于按功能对文件进行分组,因此每个测试文件都位于包含要测试的逻辑的文件旁边。 命名测试文件始终可与file参数或grep选项一起使用,但是我想显式地忽略node_modules

对于任何希望-gulp-mocha都可以实现这一目标的人,我只是讨厌在不需要的地方加上gulp

我想花一点时间+1这个想法。 与典型的JavaScript项目不同,我喜欢遵循GO进行单元测试的方式,并且在要测试的每个文件旁边都包含一个规范文件。 例如,我的一个项目中的目录可能如下所示:

main.js
main.spec.js
utilities.js
utilities.spec.js

我发现这种类型的组织使查找测试和将其挖掘到单个测试文件目录变得容易得多。 您总是希望测试位于测试文件的旁边,而我的构建脚本将部署版本中的所有.spec.js文件脚本化。

由于我的布局是非标准的,因此我想对所有文件夹(不包括node_modules目录)运行所有单元测试。

我目前附近没有Windows框,但是我不确定该查找语法是否可以在Windows中使用; 在我看来,排除选项将更加直观。 再加上几乎所有的单元测试框架都包含一种忽略文件的方式,因此奇偶校验会很好。

嗨,我所有的测试都支持*.test.js格式。 它们都在tests目录中。 目前,我有一些要排除的测试,并且仍然保留mocha的默认路径为./test/**/*.js 。 我怎么做?

创建两个单独的目录在这里行不通,并且您必须同意将测试在目录之间移动会在VCS中产生很多干扰。

@calebthebrewer幸好我在项目中使用了

+1 @calebthebrewer

Angular 2.0和Polymer使我处于组件模式,因此我同意@KrisSiegel。 将所有代码捆绑在一起可保持干净,模块化,易于维护的文件层次结构。

使用q promise库以如下方式加载测试是否存在任何可预见的问题:

import q from 'q';

import authRouterTest from '../app/routes/_authentication.router.e2e.js';

import productRouterTest from '../app/routes/_product.router.e2e.js';

import productModelTest from '../app/models/product.model.spec.js';

// Dynamically constructed sequence of functions
let funcs = [ productModelTest(), authRouterTest(), productRouterTest() ];

// This function takes an array of promise-producing functions and
// runs them sequentially.
let execTests = () => {

    let result = q();

    funcs.forEach((f) => {

        result = result.then(f);
    });

    return result;
};

// Execute tests
execTests();

这样,您可以从任何地方导入文件,并且在test/只有一个测试文件。

您可以在最后一个测试块中解析承诺,并像这样包装每个测试

import q from 'q'

export default () => {

    let Q = q.defer();

    describe('something', () => {

        it('should', (done) => {

            ...
        });
    });

    describe('something', () => {

        it('should', (done) => {

            ...
        });

        it('should', (done) => {

            ...

            Q.resolve('test complete');
        });
    });

    return Q.promise;
};

除非我不考虑某些问题,否则它似乎工作得很好。

我们仍然应该忽略这个问题。 使用bash命令不是跨平台的解决方案。

+1

我真的很想排除node_modulesExclusion似乎是recursive便捷助手。

@godspeedelbow为什么需要明确忽略该特定目录? 我通常不会听到node_modules在测试目录中的消息。

FWIW,我也可以使用它。 我有几个项目,这些项目的测试范围远远超过了库本身,这使我可以更好地组织它们(夹具属于测试目录IMHO)。

当您执行意外操作时(例如,我将spec文件放在要测试的文件旁边,而不是将它们放在单个文件夹中,而不是要测试的代码中),忽略node_modules变得很重要对一个主项目及其某些包含的项目运行单元测试(也许它们是您要测试的内部库,而不是在npm repo中),但是您不想在它们自己的依赖项中运行单元测试。

这个问题已经存在了整整一年,所以我对它的实施没有太大的希望。 我认为重要的是要实施,因为变通办法要么需要特定于平台的终端命令,要么可以为要测试的每个目录明确指定模式(因此需要将其他目录添加到测试脚本中)。 我会分叉它,然后自己做,但是使用hacky方法指定每个目录和一个模式比找到时间将其实现到mocha中容易得多。

@KrisSiegel您总是可以执行src/**/*.jssrc/**/*.spec.js 。 我在Go和Rust项目中看到的频率比从项目根目录开始的频率更高。 实际上,后者相对不常见。

尽管我认为他们只是在等待某人花些时间自己做。 创建补丁似乎并不困难(除非逻辑是意大利面条式的代码状态机混乱)。

我个人不愿意这样做,因为我实际上是在自己的测试框架上工作,尽管它的核心更简单,功能更强大,但它打算完全替代Mocha,Jasmine,Tape等。 但是,对于玩具项目的ATM来说,这仍然是一项艰巨的工作。

我正在使用Mocha有效地引导框架。 最初,我将Chai用作断言,直到它们稳定为止(由于我正在使用框架的断言进行自我测试,因此它们实际上已被API锁定)。

是的,这是一种解决方法,尽管对规范和源文件进行配对也可以这么说,但我只是看不到许多JavaScript项目采用这种结构。 我基本上使用这种模式,但是当我进入已经拥有自己的自定义构建系统的大型项目时,对其进行更改并不总是那么容易。

排除是许多实用程序拥有的非常基本的模式。 我认为摩卡咖啡需要它:)。 尽管我想我的印象是,由于此问题是基于特定于平台的解决方法而关闭的,所以与等待补丁相比,这是不希望的。 如果这是摩卡咖啡爱好者真正想要的东西,那么如果在数周内没有完成,我当然可以提出补丁。

@KrisSiegel我很确定,如果有人确实推出了补丁,只要它不涉及某些不直观,特殊的语法或额外的标志,它可能会被合并。 FWIW,尚未有_this_的PR,如果考虑到平台相关的问题,此问题已关闭的原因还很薄弱。 而且我看不到有很多Windows用户愿意安装GNU find来运行一些测试。

它可能已经关闭,但是具有Web worker的Node已经发生了类似的情况,尽管Node的实现会略有偏离(已关闭问题正在进行PR )。

值+1。 我建立的项目不需要appsrc文件夹,而是具有可变数量的具有不同接口实现的命名文件夹。 我还想将我的测试捆绑在每个接口上,而不要被迫使用单个文件夹进行测试。

能够使用.mochaignore或其他选项指定要忽略的文件将是理想的,因为这样,我可以仅使用**/*.spec.js glob运行它,而不用担心它可能包含来自node_modules测试

几乎所有其他构建工具都允许这样做,我们有.npmignore.gitignore.jshintignore ,并且jscs提供了通过.jscsrc配置它的选项。 如果Mocha也支持它,这将很有用,因为越来越多的人正在朝着组件/功能文件和文件夹的组织方向发展,而不是从袜子抽屉的方法出发。

@isiahmeadows像其他人提到的那样,我services/routes/等位于项目的根目录中,就像node_modules是。 我受到启发将测试文件放在他们测试的文件旁边。 这确实很棒,但是我需要第三个工具(命令行,gulp或其他工具)来排除node_modules以便仅测试我自己的测试。

如果我知道从哪里开始,我很想自己在摩卡咖啡中实现它:

@godspeedelbow @adambuczynski临时解决方案:)

  "scripts": {
    "test": "mocha $(find . -name '*.spec.js' ! -ipath '*node_modules*')"
  }

@danielstjules谢谢! 尝试过,但是由于某种原因find . -name '*.spec.js' ! -ipath '*node_modules*'只找到一个测试文件。

您是否更新了'*.spec.js'以适应测试遵循的模式? 例如,要匹配_all_ js文件,您可以使用:

  "scripts": {
    "test": "mocha $(find . -name '*.js' ! -ipath '*node_modules*')"
  }

@danielstjules

同时,我采取了将应用程序代码和测试移至app子文件夹的方式,以便可以将目标文件夹指定为测试文件夹,而不必担心node_modules或其他文件夹。

@danielstjules是的,所有测试文件的格式均为*.spec.js 。 由于某种原因,它早些时候没有起作用,但是现在它没有问题了。 感谢您的* NIX解决。

我想在即将到来的专业中看到这一点; 特别支持.mochaignore对我来说似乎很合理

@boneskull谢谢,那太好了。

对于下一个主要版本,您是否还考虑实现用于传递选项的更“标准”的.mocharc ,可以将其放在项目的根目录中,而不必使用mocha.optstest文件夹中?

这将使配置Mocha变得更加容易,并且与现有其他工具的配置方式保持一致。 另外,这不会强迫我们只为mocha.opts提供一个test文件夹。 (我们将所有测试与他们测试的模块一起放置)。

绝对是@adambuczynski 。 我不是mocha.opts粉丝

@adambuczynski很棒的评论。 我同意,我也想要一个标准的.mocharc选项文件,我也不再使用测试目录,因为将测试放在代码旁边非常好。

+1,我认为确实需要排除。

@adambuczynski @boneskull文档指示您可以使用--opts来指定opts文件的任何路径,尽管它没有给出任何示例。 我在当前项目中正在使用它,并且可以确认它可以用作mocha --opts .mocharc

谢谢@GRUBES。 最后,我继续使用test文件夹,因为我也在其中放置了测试设置帮助程序,但是很高兴知道这是可能的。

Glob具有忽略选项,因此仅添加一个排除选项并将其转发给全局忽略应该没什么大不了的。

忽略添加模式或全局模式数组以排除匹配项。 注意:忽略模式始终处于dot:true模式,无论其他设置如何。

我不确定为什么要花一年多的时间。 :-)

@ inf3rno顺便说一句,如果有人真正坐下来并编写补丁程序,这可能早就可以解决了。

@isiahmeadows是的,但是那不是我。 :D

那这还需要公关吗? 我很乐意添加此内容,因为我希望使用测试文件托管,而不是使用testtest-integration的多个目录

2036,对于基本上相同的一般事物,仅是文件而不是命令行选项,具有PR#2173

添加--exclude类的选项也许很好。

或支持类似mocha test/*.js !test/_*.js

想通了Glob: mocha "./{,!(node_modules)/**/}*.test.js"获取除node_modules中的所有* .test.js文件, mocha "./test/**/!(notThisOne).js"获取除notThisOne.js以外的所有测试文件夹和子文件夹中的所有内容

也可以看看:
https://github.com/isaacs/node-glob#glob -primer
https://github.com/isaacs/node-glob/issues/62

@ScottFreeCode

在终端中运行时,我得到

mocha "./{,!(node_modules)/**/}*.test.js"
-bash: !: event not found

这个角色应该逃脱吗?

@mdumouchel使用单引号。 否则,是的。

@isiahmeadows

仍然出现错误

node_modules/mocha/lib/utils.js:630
        throw new Error("cannot resolve path (or pattern) '" + path + "'");
              ^
Error: cannot resolve path (or pattern) './{,!(node_modules)/**/}*.test.js'

我最终只是使用find命令

mocha $(find . -type d -name node_modules -prune -o -name '*.test.js')

@mdumouchel如果您使用的是2.x版本(即npm上的版本),则无论如何都将无法正常工作。 支持将从IIRC 3.x开始。

太奇怪了,我以为我在Bash中尝试过并且能够使用双引号。 有谁知道在Windows和Bash中都可以使用的语法/转义?

另外,我非常确定“无法解析路径”错误意味着该路径与您项目中的任何文件都不匹配; 当我拥有名称以“ .test.js”结尾的测试文件以及相应的源文件时,我给出的路径在当前版本中有效,除非我搞砸了将其从测试复制到问题注释...

参见#2173

Eslint在忽略--ignore-path (和.eslintignore )文件方面做得很好。
请参阅: http ://eslint.org/docs/user-guide/command-line-interface#ignoring -files

摩卡类似的东西太棒了:two_hearts:


我的解决方法:

eslint "test/!(fixtures)/**/*.js" "test/*.js"

我的档案结构

.
└── src
└── test
    └── fixtures
        └── data.js
    ├── foo.js
    └── bar.js

问题:如果2条路径中的任何一条都不匹配,摩卡都会给我Error: cannot resolve path (or pattern) 。。:disappointed_relieved:

好的,所以我坚持不懈。 这不是用户友好的。

我认为这是我们应该做的:

  1. 支持--exclude <glob-or-path>
  2. 支持--exclude多个实例
  3. 将所有--exclude选项与所有非选项参数合并到一个列表中(基本上是globby的工作)
  4. 加载这些文件

目前,我们支持_n_个非选项参数,它们都可以是glob,但这仅是_additive_; 这不像您期望的那样工作:

$ mocha 'src/**/*.spec.js' '!src/forbidden/**/*.spec.js'

因此上面的方法应该起作用,并且--exclude实际上只是!糖。

此外, .mochaignore (#2036)支持听起来不错,但这是一个单独的问题。 应该有一个3p模块,我们可以插入它以具有类似.gitignore的行为; 我确信ESLint所做的一切足以满足我们的目的。

...如果不清楚,请不要在命令行上使用未引用的glob; 参见#2355

令人惊讶的是,除了将所有测试放入tests文件夹之外,仍然没有像--ignore-path这样的选项,没有理由我们不能将测试与模块一起放置。

+1
通过模式忽略文件或目录是非常有用的功能

@isiahmeadows

你总是可以做src / .js和src / /.spec.js

不,您不能- **/*模式匹配已损坏,无法递归工作。

编辑: @ScottFreeCode有下面的答案

**/*模式匹配已损坏,无法递归工作。

是否引用了您的路径?

+1

image

https://github.com/zinserjan/mocha-webpack/issues/124中所述

src/有一个名为server.ts的文件,该文件将启动快速服务器,并在后台运行。 运行覆盖范围时,服务器通常已启动,因此该端口已在使用中。

因此,我们不希望仅将此文件排除在外。

我认为摩卡咖啡需要忽略,因为即使如此,维护人员仍然需要令人信服。

摩卡是佳能。 为什么不提高所有其他测试框架都渴望成为的测试框架的跨平台功能集的标准呢? 我们应该停止抱负将一切留给Bash的愿望。 它的2017年已经。

我还要指出,Windows用户没有任何等效于Bash的!(glob) (实际上是Bash主义,甚至不是POSIX标准)。

Mocha的通配形式不应存在任何Bash依赖关系,因为它是通过Glob JS模块处理的。 (注意:可能需要引用路径来避免shell处理glob与Mocha有所不同,例如,不带globstar扩展名的**或其他与之特别的东西。)

@ScottFreeCode使用glob时是否使用extglob: true ? 如果是这种情况,则可以使用该语法将其关闭,以作为一种解决方法(因为glob / minimatch支持启用该选项)。

看来我们只是在通向glob的路径。 我很确定在某个时候我会否定了glob模式,但这可能是该模块的较旧版本? 无论如何,我们都对双星行为进行了测试,因此,如果有人想提交测试以确认某些否定模式也能起作用(或者如果有人在我们已经拥有的球形测试中发现任何缺陷),那将是很好的。

但是,拥有显式的ignore / exclude选项具有一定的优势。 实际上具有多重优势:

  • 不太模糊
  • 更容易避免与不同操作系统发生冲突的特殊字符和引用规则
  • 在许多情况下,包含列表减去排除列表比带有否定项的包含列表更简单

我只是想澄清一下,现状并不意味着要依赖任何特定的shell。 ; ^)

在许多情况下,包含列表减去排除列表比带有否定项的包含列表更简单

是的,我几乎已经忘记了that

任何遇到此问题的人:

现在的解决方法是使用glob,因为应该对此予以支持。 如果有人想要这种特殊行为,请发送PR。

--exclude选项有效吗?
docs中找不到它。

@ sepo-one我打开PR来更新文档。
您可以看到mocha -h所有可用选项。

是的,我一直在使用旧版本的摩卡咖啡。 已升级,并且有--exclude选项。
我应该反正应该更新文档。

谢谢@outsideris

此页面是否有帮助?
0 / 5 - 0 等级