如何在mocha中挂钩之前设置超时?

时间:2017-01-31 04:55:17

标签: mocha

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

describe('test  ', () => {

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

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

4 个答案:

答案 0 :(得分:41)

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

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

  before(...);

  it(...);
});

在你想要在回调中使用this的所有地方,你传递给Mocha,你不能使用箭头功能。你必须使用"常规"具有自己的this值的函数,可以由Mocha设置。如果你使用箭头功能,this的值不会是摩卡想要的,你的代码也会失败。

可以为你的挂钩设置不同的超时,但有两件事需要考虑:

  1. 在这里,你也需要使用"常规"函数而不是箭头函数所以:

    before(function (done) { 
      this.timeout(10000);
    
  2. 这只会为before挂钩设置超时,不会影响您的测试。

答案 1 :(得分:2)

您还可以在timeout()的返回值上调用describe,如下所示:

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

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

答案 2 :(得分:1)

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的好处。

顺便说一句,摩卡现在可以与promises一起使用了。如果超时不是问题。只需这样做:

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

答案 3 :(得分:0)

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

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

原因是箭头函数具有fast-fail