题 更改mocha的默认超时


我有以下问题 如果我们有单元测试文件my-spec.js并使用mocha运行:

mocha my-spec.js

默认超时为2000 ms。可以使用命令行参数覆盖部分测试:

mocha my-spec.js --timeout 5000

问题是: 是否可以全局更改所有测试的默认超时? 我打电话的时候

mocha my-spec.js

默认超时值与2000毫秒不同 提前致谢


93
2018-05-06 10:23


起源


摩卡的 官方网站 还解释了更多。 - RaviRokkam


答案:


默认情况下,Mocha将读取一个名为的文件 test/mocha.opts 可以包含命令行参数。所以你可以创建一个包含以下内容的文件:

--timeout 5000

每当您在命令行运行Mocha时,它将读取此文件并默认设置5秒的超时。

根据您的情况,另一种可能更好的方法是将其设置为顶级 describe 调用你的测试文件:

describe("something", function () {
    this.timeout(5000);

    // tests...
});

这将允许您仅基于每个文件设置超时。

如果您希望全局默认值为5000但可以为某些文件设置不同的内容,则可以使用这两种方法。


请注意,如果要打电话,通常不能使用箭头功能 this.timeout (或访问任何其他成员 this 那个摩卡为你设定的)。例如, 这通常是行不通的

describe("something", () => {
    this.timeout(5000);

    // tests...
});

这是因为箭头功能需要 this 从函数出现的范围.Mocha将调用具有良好值的函数 this 但该值未在箭头函数内传递。 Mocha的文档说明了 这个话题

不鼓励将箭头函数(“lambdas”)传递给Mocha。由于它的词汇绑定,这些函数无法访问Mocha上下文。


182
2018-05-06 10:42



谢谢你的信息。但我试图修改mocha.opts文件,但它没有影响。 - lm.
你是在正确的地方创造的吗? Mocha非常关注它想要这个文件的位置。如果您运行Mocha /home/me/src/proj/ 然后Mocha将搜索此文件: /home/me/src/proj/test/mocha.opts - Louis
非常感谢 。现在变化受到了影响 - lm.
this.timeout(10000); //默认超时^ TypeError:this.timeout不是Suite的函数。<anonymous>(/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10) - Jeff Lowery
@JeffLowery您使用的是箭头功能吗?箭头功能不会建立新的 this,这通常导致 this.timeout 像你在评论中显示的那样失败。 - Louis


如果您(像我一样)在浏览器而不是服务器上运行Mocha,您始终可以使用更改全局配置 mocha.setup

mocha.setup({ timeout: 5000 });

只需在测试套件的任何位置添加上面的行,最好是在规范的顶部或单独的测试助手中。

这里是 链接到文档 以及一些示例说明如何在浏览器中配置Mocha。


22
2017-07-06 17:08



这在Node中不起作用。看到 stackoverflow.com/a/47915119/893113。似乎CLI选项是唯一的方法。 - paulmelnikow


添加此项以获得完整性。如果你(像我一样)使用你的脚本 package.json 文件,只需添加 --timeout 摩卡选项:

"scripts": {
  "test": "mocha 'test/**/*.js' --timeout 10000",
  "test-debug": "mocha --debug 'test/**/*.js' --timeout 10000"
},

然后你就可以跑了 npm run test 运行测试套件,超时设置为10,000毫秒。


21
2017-08-29 22:22



如果有人感兴趣,大多数IDE还允许您为测试执行注入mocha选项;例如对于WebStorm,您可以在Run-> Edit Configurations-> Extra Mocha Options下输入(即“--outout 10000”)。 - Rubicon
我喜欢你,我会像你一样使用它! ^。^ - Alex Yaroshevich


只需添加正确的答案,您可以使用箭头功能设置超时,如下所示:

it('Some test', () => {

}).timeout(5000)

19
2017-07-20 16:18



问题是“为所有测试全局更改默认超时”。你的答案只改变一个测试。 describe('suite', () => {...}).timeout(5000) 不起作用。 - aleung