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

vktxenjb  于 2023-03-28  发布在  Java
关注(0)|答案(8)|浏览(115)

我在一个测试用例中提交一个网络请求,但这有时需要超过2秒的时间(默认超时)。
如何增加单个测试用例的超时?

sq1bmfud

sq1bmfud1#

给你: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);
8wtpewkr

8wtpewkr2#

如果你想使用es6箭头函数,你可以在it定义的末尾添加一个.timeout(ms)

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

至少这在Typescript中是有效的。

3gtaxfhh

3gtaxfhh3#

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

使用ES 2015胖箭头语法时要小心:

将失败:

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在评论中提到的,fat arrow 函数没有自己的 this 绑定。因此,it 函数不可能绑定到回调的 this 并提供 timeout 函数。

  • 底线 *:不要对需要增加超时的函数使用箭头函数。
ippsafx7

ippsafx74#

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

"test": "mocha --timeout 10000"

然后你可以使用npm运行如下:

npm test
ocebsuys

ocebsuys5#

从命令行:

mocha -t 100000 test.js
nhjlsmyf

nhjlsmyf6#

你也可以考虑采用不同的方法,用stub或mock对象代替对网络资源的调用,使用Sinon,你可以将应用从网络服务中分离出来,集中精力进行开发。

igetnqfo

igetnqfo7#

对于Express上的测试导航:

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

describe('navigation', () => {
    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)在所有这些时间都被避免使用。

iyr7buue

iyr7buue8#

这对我很有效!之前找不到任何东西让它工作()

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 
});

相关问题