【问题标题】:Testing Mocha/supertest/expect MEAN-stack HTTP Request 4 seconds delay done测试 Mocha/supertest/expect MEAN-stack HTTP Request 4 秒延迟完成
【发布时间】:2018-10-26 09:42:10
【问题描述】:

我正在使用 Mocha/supertest/expect 库在 MEAN-Stack 中测试 HTTP 请求,需要 4 秒才能返回:

it('should return product data', (done) => {
    request(app)
    .get('/P/Product')
    .expect(200)
    .expect((res) => {
        expect(res.body[0]._id).toEqual('123456789')
    })
    .end(done);
});

在 HTTP 请求完成后,函数应在最后执行“完成”回调。但我收到错误:

1) should return product data:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a
Promise, ensure it resolves. 

我认为它适用于未嵌套的期望调用。我将如何使用其他期望调用中的嵌套期望调用来做到这一点,就像上面的示例一样?

【问题讨论】:

    标签: asynchronous testing mocha.js supertest


    【解决方案1】:

    可能请求的响应时间太长,导致 Mocha 默认的 2 秒测试超时发生。可能尝试从 CLI 到 url 的 cURL 以查看您返回的时间或测试 mocha test time threshold 的时间。

    describe('testing', function() {
        // This applies the timeout of 5 seconds to each test.
        this.timeout(5000);
    
        it('should return product data', function() {
           // This applies a timeout of 5 seconds for this test only
           this.timeout(5000);
           request(app)
               .get('/P/Product')
               .expect(200)
               .expect((res) => {
                    expect(res.body[0]._id).toEqual('123456789')
               })
               .end(done);
           });
    });
    

    如果您认为expect 调用链导致超时问题,另一种方法是使用承诺方法。

    it('should return product data', () => {
       request(app)
       .get('/P/Product')
       .then((res) => {
           expect(res.status).to.equal(200);
           expect(res.body[0]._id).to.equal('123456789');
       })
    });
    

    【讨论】:

    • hmm 你能举个例子如何设置摩卡测试时间阈值吗? beforeEach(function(done) { this.timeout(3000); setTimeout(done, 3000); 这不起作用...
    • 我编辑了我的答案,以提供如何使用在套件级别或单个测试级别设置超时的示例
    • 嘿,谢谢你的例子,我在我的代码中尝试了同样的方法,但我得到:TypeError: this.timeout is not a function...我用谷歌搜索了一下,似乎还有很多其他的同样的问题,请问有解决办法吗?如果您使用 timout 选项运行 mocha,它实际上可以在全局范围内运行:“mocha --timeout 15000”但不在测试单元级别...
    • 奇怪,当它预计超过 2 秒时,这在我自己的测试中对我有用。根据 mocha 文档,这也是超时的方法
    • 您可能在describe 上使用了箭头函数,这就是未定义this.timeout 的原因。使用describe('title', function() {...} 而不是describe('title',() => {...}
    【解决方案2】:

    我得到了解决方案,问题是使用箭头函数:(done)=>{...},而不是正常的回调,它的工作原理是这样的:

    it('should async square a number', function(done) {  
        this.timeout(2005);
        utils.asyncSquare(5, (res) => {
          expect(res).toBe(25).toBeA('number');
          done();
        });
      });
    

    或者,如果您在包测试脚本中全局设置超时,它也可以工作:

    "test": "mocha --timeout 3000 **/*.test.js",
    

    【讨论】:

    • @AndrewNolan 回答了你问题的症结(使用.timeout),所以我建议你删除你的答案并接受他的答案。您使用箭头函数的事实与您遇到的原始问题相切。
    • @AndrewNolan 的解决方案不像他展示的那样工作,您需要在 it 函数中使用正常的回调函数(完成),但感谢减号...
    • 没问题,我很乐意再为那些因为不知道如何使用箭头函数而鄙视他人帮助他所做的工作的人再做一次。
    • 嗯,你说得对,我刚刚再次测试它,它工作。我把我的右括号从顶层描述错误,这就是问题..对不起,没有理由粗鲁,伙计;)
    • 你错过了这里的重点。 @AndrewNolan 告诉你关于你以前不知道的timeout。这就是答案。如何让timeout 工作与问题无关。如果您认为他的答案可以改进,请编辑它但​​仍然接受它。没有人会因帮助您解决问题而获得报酬,您至少可以通过适当地授予声誉来表明您对这些努力表示赞赏。
    猜你喜欢
    • 2023-03-13
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2021-08-16
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多