如何在Mocha中增加单个测试用例的超时


405

我正在测试用例中提交网络请求,但这有时需要2秒钟以上的时间(默认超时)。

如何增加单个测试用例的超时时间?

Answers:


669

您可以在这里:http : //mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

对于箭头功能,使用如下:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
超时是在毫秒,则默认2000
探米克

47
我使用的是es6箭头函数,必须退回到旧的“函数”定义才能使用“ this”。
Aruna Herath,2015年

1
也适用于钩子,例如before(function(done){this.timeout(5 * 1000);...});
JP

2
@AH箭头功能无法正常工作的原因是因为它是词汇
Tanner Faulkner16年

11
有没有办法让它与箭头功能一起使用?编辑:添加.timeout(500)it(...).timeout(500)
chovy

136

如果希望使用es6箭头功能,可以.timeout(ms)it定义的末尾添加a :

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

至少这在Typescript中有效。


3
这项工作有效,但未.timeout包含在摩卡(Mocha)的DefinitelyTyped类型中:i.imgur.com/jQbWCn1.png-使用this.timeout(2000)this.slow(500)与常规旧函数一起工作并可以正确编译
Leon Adler,

3
可悲的是,这仅适用于it,不适用于describe
罗布里希

3
是有办法做到这一点的describe()还是context()
chovy

1
@LeonAdler .timeout现在包含在DefinitelyTyped的Mocha输入中:Mocha.IRunnable。但是,如果您使用Webstorm IDE来运行这些测试,请注意以下几点:由于任何原因,WebStorm的Mocha集成插件仍然无法识别.timeout()附加了Mocha测试(这意味着它们旁边没有“运行”按钮),因此,我主张避免使用箭头功能以允许使用this.timeout()代替功能。
Jamie Birch

太棒了。对于返回承诺的异步函数,您可以省略done()。
billoverton

72

(因为我今天遇到了这个)

使用ES2015粗箭头语法时要小心:

这将失败:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

编辑:为什么失败:

作为@atoth在评论中提到,胖箭头函数没有自己的这一具有约束力。因此,不可能将it函数绑定到回调并提供超时功能。

底线:对于需要增加超时的功能,请不要使用箭头功能。


2
因为箭头功能根本没有这个。在此处了解更多信息:blog.getify.com/arrow-this
atoth,2016年

2
是的,但是我已经在答案中对此进行了解释。看到我的评论。//在代码中。我可能应该在代码块之外进行解释,以使其更加清晰。这确实存在,但它来自外部范围。
chriskelly '16

1
我的解释比较准确。this箭头函数没有绑定-用不同的方式暗示它们具有某种不同。他们只有词汇范围。您不能绑定不存在的内容。这就是为什么.bind.call等无法使用它的原因。
atoth 2016年

1
没错-您的权利更准确。谢谢
chriskelly '16

1
我会说这就是为什么只在需要时才使用粗箭头的原因,但是我却没弄清楚this是什么。
xdumaine

42

如果在NodeJS中使用,则可以在package.json中设置超时

"test": "mocha --timeout 10000"

那么您可以使用npm像这样运行:

npm test

1
这适用于所有测试用例,而不是单个测试用例
garryp '19

同意这不能回答问题,但是对于我的用例来说已经足够了,我不在乎是否所有测试都增加了它。我认为很多人可能不在乎是否要进行一项测试或全部测试,因此,我很感谢这个答案。
billoverton

22

从命令行:

mocha -t 100000 test.js

14
这增加了所有测试用例的超时时间而不是问题所要求的“特定测试用例” 超时。
路易

16

您可能还会考虑采用其他方法,并用存根或模拟对象替换对网络资源的调用。使用Sinon,您可以将应用程序与网络服务脱钩,从而集中精力进行开发。


7
这不是完全无关紧要的。通常,对网络响应进行存根是很有意义的,因此您不必依赖于该计算机正在运行或返回正确的响应。但是,如果您正在测试响应本身,那么您仍然需要这样做。
2015年

2
我正在使用sinon / mocha来构建一些集成测试,因此更高的超时时间很重要。
jcollum

9

用于以下方面的测试导航Express

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

在示例中,测试时间为4000(4s)。

注意:在测试时间内setTimeout(done, 3500)小于done被调用的时间,但是clearTimeout(timeOut)在所有这些时间内都避免使用过。


2

这对我有用!找不到任何可以与before()一起使用的东西

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.timeout()完美运行!
acidjazz
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.