如何使用Mocha进行单个测试?


Answers:


355

尝试使用摩卡--grep选项

    -g, --grep <pattern>            only run tests matching <pattern>

您可以将任何有效的JavaScript正则表达式用作<pattern>。例如,如果我们有test/mytest.js

it('logs a', function(done) {
  console.log('a');
  done();
});

it('logs b', function(done) {
  console.log('b');
  done();
});

然后:

$ mocha -g 'logs a'

运行单个测试。请注意,这会跨越所有describe(name, fn)it(name, fn)调用。

考虑使用describe()命名空间的嵌套调用,以便于查找和选择特定集合。


1
谢谢!我的印象是--grep只能从@标签中过滤掉。
kumarharsh 2014年

5
以编程方式使用Mocha时(例如从Grunt中使用),有一个陷阱:grep选项必须是一个“ RegExp()”对象。如果是字符串,它将被转义。
h-kippo 2014年

1
这是唯一对我有用的解决方案。在命令行(mocha some/test.js)上指定文件根本不起作用。谢谢!
hraban

2
有什么办法可以避免同时运行logs a bcd包含logs a子字符串的内容?正则表达式^$不工作0.10.2。
西罗Santilli郝海东冠状病六四事件法轮功

谢谢。如果不将目录指定为mocha -g'logs a',则会出现一些错误。
kta

165

根据您的使用模式,你可能只是想用。我们使用TDD样式;它看起来像这样:

test.only('Date part of valid Partition Key', function (done) {
    //...
}

仅此测试将从所有文件/套件运行。


5
BDD的工作原理相同。当您进行单个测试时,这非常有用。它也可以用于套件/描述级别
andyzinsser

14
使用chai并期望语法为it.only
elkelk '16

4
这个答案是更好,因为它也将在摩卡从里面因缘等使用的工作
维韦克Kodira

2
it.only不会一起工作given摩卡TESTDATA。而且很容易忘记以后将其删除。
Tr1et

4
eslint-plugin-mocha有一个规则no-exclusive-tests,如果您忘记删除,将会抓住您.only
dostu

84

如果您正在使用npm test(使用package.json脚本),请使用--其他参数将参数传递给摩卡

例如 npm test -- --grep "my second test"

编辑:看起来--grep可能有点挑剔(可能取决于其他参数)。您可以:

修改package.json:

"test:mocha": "mocha --grep \"<DealsList />\" .",

或替代使用--bail似乎不太麻烦

npm test -- --bail

3
为我工作。谢谢:)
吉尔-爵Vie的

1
@Andy --grep 可能有点挑剔-尝试将其放在npm脚本条目中的摩卡之后。否则npm test -- --bail,在第一次失败的测试后对保释很有用
Ashley Coolman

1
--grep拯救我的一天之前传递额外的破折号!非常感谢。PS。我在Windows上运行npm test -- --grep @tag
Mykola,

18

通过文件名运行单个测试

其实,我们也可以运行单个测试摩卡通过文件名(不只是“它() -字符串grepping”)如果您删除glob模式(例如,./test/**/*.spec.js从mocha.opts中),并分别创建了一个副本,,而无需执行以下操作:

node_modules/.bin/mocha --opts test/mocha.single.opts test/self-test.spec.js

这是我的mocha.single.opts(只是缺少上述的glob行而已)

--require ./test/common.js
--compilers js:babel-core/register
--reporter list
--recursive

背景:虽然您可以覆盖opts-File中的各种开关(以开头--),但不能覆盖glob。该链接也有一些解释。

提示:如果node_modules/.bin/mocha让您感到困惑,请使用本地软件包mocha。mocha如果已全局安装,也可以只编写。


并且,如果您想要以下这些的舒适之处package.json:仍然:**/*从您的设备中删除-ish globmocha.opts,将其插入此处,以进行所有测试,将其留给一次测试:

"test": "mocha ./test/**/*.spec.js",
"test-watch": "mocha -R list -w ./test/**/*.spec.js",
"test-single": "mocha $1",
"test-single-watch": "mocha -R list -w $1",

用法:

> npm run test

分别

> npm run test-single -- test/ES6.self-test.spec.js 

(注意--!)


在我的设置中不需要$ 1,而是导致出现以下警告: Warning: Could not find any test files matching pattern: $1
Merijn Vogel

15

仅在“描述”,“描述”或“上下文”之前使用。我使用“ $ npm run test:unit”运行,它仅使用.only执行单位。

describe.only('get success', function() {
 // ...
});

it.only('should return 1', function() {
  // ...
});

11

您好上述解决方案对我不起作用。运行单个测试的另一种方法是

mocha test/cartcheckout/checkout.js -g 'Test Name Goes here'

这有助于从单个文件使用特定名称运行测试用例。


1
使用具有足够选择性的表达式,-g您无需指定文件名。如果您不能编写一个具有足够选择性的表达式,则意味着您没有正确命名测试。
路易

10
npm test <filepath>

例如:

npm test test/api/controllers/test.js

这里的“ test / api / controllers / test.js”是文件路径。


8

您可以尝试“仅它”

 it.only('Test one ', () => {

            expect(x).to.equal(y);
        });
it('Test two ', () => {

            expect(x).to.equal(y);
        });

在这第一个只会执行


2
如果未通过--forbid-onlyCI /构建服务器执行测试,则存在危险。.only倾向于潜入主分支并使其静音,因为它们将不再执行。我想到将更改代码以运行不同测试的工作流程视为反功能。测试运行者应确定应执行哪些测试(也称为标记测试)而不是开发人员。
k0pernikus

我已经用它来测试本地的一项功能,请注意:不要使用代码提交存储it.only
Bikesh M,


0

不知道为什么使用npm test时grep方法对我不起作用。虽然可以。由于某种原因,我还需要指定测试文件夹。

npm测试-test / sometest.js


0

将所有测试合并到一个test.js文件中,并将包json添加脚本如下:

  "scripts": {
  "api:test": "node_modules/.bin/mocha --timeout 10000 --recursive api_test/"
},

在测试目录中键入命令:

npm run api:test
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.