如何解决Cucumber JS - 是否可以在 setDefinitionFunctionWrapper 中以编程方式设置 defaultTimeout 值?
开箱即用的 Cucumber 提供了一种方法来设置每个步骤的默认超时,或者所有步骤都将通过使用 setDefaultTimeout(value)
使用的“全局”超时。
但是,没有办法设置场景级别的超时,即整个场景应该在 X 毫秒后超时。
我处于需要确保任何给定场景运行时间不会超过 X 分钟的情况,但我还需要该过程以任何 After 挂钩运行干净地结束,就像测试失败一样。我的想法是做这样的事情:
const MAX_DURATION = 2 * 60 * 1000;
let startTime: number | undefined;
let endTime: number | undefined;
setDeFinitionFunctionWrapper(function(func: Function) {
return async function(this: any,...args: any[]) {
if(startTime && endTime) {
setDefaultTimeout(Math.max(endTime - Date.Now(),0));
}
return await func.apply(this,args);
};
});
Before(() => {
startTime = Date.Now();
endTime = startTime + 1000;
});
理论是在每个场景之前,我会抓住现在的时间,计算出超时的时间,然后在每个步骤之前将默认超时设置为 endTime
值减去现在的时间.
虽然这不起作用。我假设在 Cucumber lib 中构建步骤时,超时是在每个步骤级别计算出来的,并且无法更改。
我不能简单地使用 setTimeout 并抛出错误,因为这会导致未处理的 promise 异常并且 Cucumber 直接退出。
有没有人尝试过类似的方法,或者对如何实现这一目标有任何想法?
解决方法
所以我重新考虑了我的方法,这样的事情似乎可以解决问题:
setDefinitionFunctionWrapper(function (func: Function) {
return async function (this: any,...args: []) {
if (!maxEndTime) return await func.apply(this,args);
let id: NodeJS.Timeout | undefined;
const execution = func.apply(this,args);
const timeout = new Promise((resolve) => {
id = global.setTimeout(() => {
hasTimedOut = true;
resolve('skipped');
},Math.max(maxEndTime - Date.now(),0));
});
const res = await Promise.race([execution,timeout]);
if (id) clearTimeout(id);
return res;
};
});
这会创建两个 promise - 一个在指定的超时后解决,一个在测试步骤完成。然后我与他们比赛,先解决者获胜!
然后我会在其他地方处理 hasTimedOut
值,以便为该结果执行适当的操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。