【问题标题】:How to increase timeout for a single test case in mocha如何增加摩卡中单个测试用例的超时时间
【发布时间】:2013-04-04 23:16:00
【问题描述】:

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

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

【问题讨论】:

    标签: javascript mocha.js


    【解决方案1】:

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

    【讨论】:

    • 超时以毫秒为单位,默认为2000。
    • 我使用的是 es6 箭头函数,必须回退到旧的“函数”定义才能使“this”正常工作。
    • @AH 箭头函数不起作用的原因是lexical this
    • 有没有办法让它与箭头功能一起工作?编辑:将.timeout(500) 添加到it(...).timeout(500) 的末尾
    • Mocha 特别反对箭头函数:mochajs.org/#arrow-functions。 IMO 值得在答案中指出。
    【解决方案2】:

    您也可以考虑采用不同的方法,用存根或模拟对象替换对网络资源的调用。使用Sinon,您可以将应用与网络服务分离,专注于您的开发工作。

    【讨论】:

    • 这不是完全不相关的;通常,存根网络响应是有意义的,这样您就不必依赖该机器启动或返回正确的响应。但是,如果您正在测试响应本身,那么是的,您仍然需要这样做。
    • 我正在使用 sinon/mocha 构建一些集成测试,因此需要更高的超时时间。
    【解决方案3】:

    从命令行:

    mocha -t 100000 test.js
    

    【讨论】:

    • 这会增加所有测试用例的超时时间,而不是像问题所问的那样“针对特定测试用例”。
    【解决方案4】:

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

    使用 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 在 cmets 中提到的,胖箭头 函数没有自己的 this 绑定。因此,it 函数不可能绑定到回调的 this 并提供 timeout 函数。

    底线:不要将箭头函数用于需要增加超时的函数。

    【讨论】:

    • 因为箭头函数根本没有这个。在这里阅读更多:blog.getify.com/arrow-this
    • 是的,但我已经在答案中解释了这一点。看我的评论。 // 在代码里面。我可能应该在代码块之外解释它以使其更清楚。这确实存在,但它来自外部范围。
    • 我的解释比较准确。箭头函数上没有this 绑定——不同的方式表明它们有某种,只是不同。它们只有词法范围。你不能绑定不存在的这个。这就是为什么.bind.call 等无法使用它的原因。
    • 确实如此 - 而且您的权利更准确。谢谢
    • 我想说这就是为什么你应该只在需要时才使用粗箭头,但我已经不知道 this 是什么了。
    【解决方案5】:

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

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

    至少这在 Typescript 中有效。

    【讨论】:

    • 这行得通,但 .timeout 不包含在 mocha 的肯定类型分型中:i.imgur.com/jQbWCn1.png - 使用 this.timeout(2000)this.slow(500) 与常规旧函数一起工作并且编译没有错误
    • 很遗憾,这只适用于it,不适用于describe
    • 有没有办法为describe()context() 执行此操作?
    • @LeonAdler .timeout 现在包含在 distinctlyTyped 的 Mocha 类型中:Mocha.IRunnable。但是,如果您使用 Webstorm IDE 运行这些测试,请注意:无论出于何种原因,WebStorm 的 Mocha 集成插件仍然无法识别附加了 .timeout() 的 Mocha 测试(这意味着旁边没有出现“运行”按钮它们),因此我主张避免使用箭头函数以允许使用this.timeout()
    • 这是完美的。对于返回 promise 的异步函数,您可以省略 done()。
    【解决方案6】:

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

    "test": "mocha --timeout 10000"
    

    然后你可以使用 npm 运行:

    npm test
    

    【讨论】:

    • 适用于所有测试用例,而不是单个测试用例
    • 同意这不能回答问题,但对于我不在乎所有测试是否增加的用例来说已经足够了。我认为很多最终来到这里的人可能并不关心这是为了一个测试还是全部,所以我很感激这个答案在这里。
    【解决方案7】:

    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) 它一直避免使用。

    【讨论】:

      【解决方案8】:

      这对我有用!找不到任何东西可以使它与 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 
      });
      

      【讨论】:

        猜你喜欢
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多