排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器
Posted
技术标签:
【中文标题】排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器【英文标题】:Detox Testing: Tracking down Javascript timers causing test framework to wait forever 【发布时间】:2018-10-12 21:40:07 【问题描述】:Detox 测试框架,根据文档TroubleShooting Synchronization 提到,测试框架将等待并且仅在应用程序“空闲”时执行您的下一个测试语句。
我现在遇到的问题是我的应用永远不会空闲,因为有一些超时持续触发。它可能在我的代码或第三方代码中。
这是一个输出示例:
正如您所见,每隔几毫秒就会创建一个新计时器。我想做的是追踪哪一个,我可以看到 id,但不知道尝试追踪这个 (setTimeout) id 的确切来源的好方法。
我曾想过封装 setTimeout 函数,但不知道最好的方法是什么。 我可以在我自己的代码中消除或至少将setTimout
包装起来,这样至少可以确定它是第三方库(这仍然无助于解决问题)。
【问题讨论】:
不是答案,但帮助我找到了解决方案。在./node_modules/detox/src/client/actions/actions.js
内部有一个名为CurrentStatus
的类,其中以下行被注释掉了://console.log("res:" + JSON.stringify(response, null, 2));
在handle
方法内部。它提供了有关计时器设置位置的更可靠的信息。希望有帮助。 Detox 11.0.1
【参考方案1】:
您可以通过以下方式轻松追踪 setTimeouts:
// DEV mode only!
function failOnTimeout(func)
const setTimeout = f =>
throw new Error(`Executing timeout \n $f.toString() \n`);
;
// A small trick to change scope:
eval("(" + func.toString() + ")()");
所以你可以这样做:
failOnTimeout(someMysteriousFunction);
并且会为您提供该函数中设置的第一个超时的堆栈跟踪(同步)。然后,您可以将其注释掉并搜索下一个。
但不是跟踪所有超时,一个快速的解决方案可能是抛出一个未捕获的错误来结束进程。
【讨论】:
以上是关于排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器的主要内容,如果未能解决你的问题,请参考以下文章
排毒测试 + React Native + PouchDB 应用程序:由于一些 PouchDB 同步,我们的登录测试一直失败并超时?