【问题标题】:How to set timeout on before hook in mocha?如何在摩卡钩子之前设置超时?
【发布时间】:2017-01-31 04:55:17
【问题描述】:

我想在 mocha 测试用例的钩子之前设置超时值。我知道我可以通过在 mocha 的命令行上添加 -t 10000 来做到这一点,但这会改变每个测试用例的超时值。我想找到一种以编程方式更改超时的方法,下面是我的代码:

describe('test  ', () => {

  before((done) => {
        this.timeout(10000);
         ...

它会抱怨 this.timeout(1000) 的行 timeout 没有定义。如何在钩子前设置超时。

【问题讨论】:

    标签: mocha.js


    【解决方案1】:

    如果您希望它影响describe 中的所有测试,您需要在describe 块中而不是在钩子中设置超时。但是,您需要使用“常规”函数作为describe 的回调,而不是箭头函数:

    describe('test', function () {
      this.timeout(10000);
    
      before(...);
    
      it(...);
    });
    

    在所有你想在传递给 Mocha 的回调中使用 this 的地方,你不能使用箭头函数。您必须使用一个“常规”函数,它有自己的 this 值,可由 Mocha 设置。如果您使用箭头函数,this 的值将不是 Mocha 想要的值,您的代码将失败。

    可以为您的 before 钩子设置不同的超时时间,但有两点需要考虑:

    1. 在这里您也需要使用“常规”函数而不是箭头函数,因此:
    before(function (done) { 
      this.timeout(10000);
    
    1. 这只会为 before 挂钩设置超时,不会影响您的测试。

    【讨论】:

    • 请注意,在之前设置超时,例如before(done => {this.timeout(10000); setTimeout(()=>{done()}, 2500)});不起作用。您必须在before 之前设置超时。
    • @ericP 您展示的示例不会更改 before 钩子 的超时时间,因为您使用的是箭头函数。所以this.timeout()错误的this 上执行。如果您将传递给before 的函数更改为常规函数,则this.timeout() 将在正确的this 上运行,并且超时将应用于您的before 挂钩。这是我在答案末尾列出的第一个“要考虑的事情”。
    • 箭头函数是明确的,所以我可以访问describe函数的this。尝试使用或不使用箭头功能。
    • @ericP 在第一次回复之前我确实尝试过。我写的是正确的:如果您只是将您的箭头函数更改为您显示的代码中的常规函数​​,代码工作。你决定使用我的回答说你不应该使用的代码,然后它就不起作用了。嗯……
    【解决方案2】:

    按照https://mochajs.org/#hook-level 的说明,您必须使用常规函数调用来设置超时。

    before(function(done) {
      this.timeout(3000); // A very long environment setup.
      setTimeout(done, 2500);
    });
    

    如果你坚持在钩子中使用arrowasync 函数。你可以这样做:

    before(function (done) {
      this.timeout(3000);
      (async () => {
        await initilizeWithPromise();
      })().then(done);
    });
    

    如果你有多个异步调用需要在钩子中解决,这将非常有用且美观。

    更新:函数 def 也适用于 async。所以这个钩子可以升级为

    before(async function () {
      this.timeout(3000);
      await initilizeWithPromise();      
    });
    

    所以它提供了thisawait 的好处。

    顺便说一句,mocha 现在与promises 配合得很好。如果超时不是问题。只需这样做:

    before(async () => {
      await initilizeWithPromise();
    });
    

    【讨论】:

      【解决方案3】:

      你也可以在describe的返回值上调用timeout(),像这样:

      describe('test', () => {
        before(...);
        it(...);
      }).timeout(10000);
      

      通过这种方法,您可以使用箭头函数,因为您不再依赖this

      【讨论】:

      • 使用这种方法仍然会失败,“超时超过 2000 毫秒”...
      • 它不会因为超时而停止before,它也会在before钩子这种情况下失败。
      【解决方案4】:

      在 before 钩子中调用 this.timeout(milliseconds); 是正确的。无论如何,您需要为钩子使用常规函数 (function (done) ...) 而不是箭头函数 (done => ...)。

      before(
          function(done) {
              this.timeout(10000);
              ...
          }
      );
      

      原因是箭头函数有no this binding

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        相关资源
        最近更新 更多