我想在mocha测试用例中挂钩之前设置超时值。我知道我可以通过在mocha的命令行上添加-t 10000
来做到这一点,但这会改变每个测试用例的超时值。我想找到一种方法来以编程方式更改下面的代码:
describe('test ', () => {
before((done) => {
this.timeout(10000);
...
它会抱怨未定义this.timeout(1000)
的行timeout
。如何在挂钩前设置超时。
答案 0 :(得分:41)
如果您希望它影响describe
中的所有测试,则需要在describe
块中而不是在挂钩中设置超时。但是,您需要使用"常规"用作describe
的回调而不是箭头函数:
describe('test', function () {
this.timeout(10000);
before(...);
it(...);
});
在你想要在回调中使用this
的所有地方,你传递给Mocha,你不能使用箭头功能。你必须使用"常规"具有自己的this
值的函数,可以由Mocha设置。如果你使用箭头功能,this
的值不会是摩卡想要的,你的代码也会失败。
你可以为你的挂钩设置不同的超时,但有两件事需要考虑:
在这里,你也需要使用"常规"函数而不是箭头函数所以:
before(function (done) {
this.timeout(10000);
这只会为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);
});
如果您坚持在挂钩中使用arrow
或async
函数。您可以这样操作:
before(function (done) {
this.timeout(3000);
(async () => {
await initilizeWithPromise();
})().then(done);
});
如果您有多个异步调用要在钩子中解决,这将非常有用并且外观漂亮。
已更新:函数def也可以与async
配合使用。因此,此挂钩可以升级到
before(async function () {
this.timeout(3000);
await initilizeWithPromise();
});
因此,它提供了this
和await
的好处。
顺便说一句,摩卡现在可以与promises
一起使用了。如果超时不是问题。只需这样做:
before(async () => {
await initilizeWithPromise();
});
答案 3 :(得分:0)
在前钩中调用this.timeout(milliseconds);
是正确的。无论如何,您需要对钩子使用常规函数(function (done) ...
,而不是箭头函数(done => ...
)。
before(
function(done) {
this.timeout(10000);
...
}
);
原因是箭头函数具有fast-fail。