我有一个中型 Angular 应用程序,由于某些原因,我的一些量角器测试在我的实时生产环境中运行时超时。
我相当确定超时是由于量角器等待某些异步任务而发生的。我了解区域,并且我尝试将所有长时间运行的异步任务保留在 ngZone 之外(根据the FAQ https://github.com/angular/protractor/blob/master/docs/timeouts.md),但由于某种原因量角器仍然超时。
我可能错过了一些东西,但我不知道如何调试问题。有什么方法可以找出代码量角器正在等待的哪一部分?
NgZone 仅公开函数来确定是否正在运行微任务或宏任务,但不会告诉我是哪一个。
EDIT:此类超时错误的典型示例如量角器所示:
失败:等待异步 Angular 任务在 11 秒后完成时超时。这可能是因为当前页面不是 Angular 应用程序。请参阅常见问题解答了解更多详情:https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular
等待带有定位器的元素时 - Locator: By(css 选择器, [data-e2e='scroll-to-offer'])
该元素存在于页面上(我已经手动验证了这一点),但量角器仍然超时。
我有一个类似的问题,可测试性 https://angular.io/api/core/Testability不稳定,我只知道我有一些pendingMacroTasks
。本地化这些任务确实有点棘手(您不会浏览整个代码库并寻找setTimeout
).
不过我最终还是做到了。
相对简单的解决方案
您可以做的第一件事是在 Chrome 中打开开发工具,按Ctrl+O
, type zone.js并按Enter
.
这将打开zone.js源文件(不是 Typescript,而是其他东西)。
Inside zone.js寻找Zone.prototype.runTask
并在该方法中放置一个断点。
启用断点加载应用程序后,否则会被击中太多次。
如果你的可测试性不稳定,这可能意味着你有一些重复的重新安排自身的宏任务。至少那是我的情况。
如果是这种情况,则在加载应用程序后,每 X 次都会命中断点。
命中断点后,转到task.callback.[[FunctionLocation]]
这将带你(很可能)一些setTimeout
or setInterval
.
要修复它,请运行它角区之外 https://angular.io/api/core/NgZone#runoutsideangular.
有点棘手的解决方案
这涉及调整 Zone.js 代码,但为您提供更持久的调试信息。
- Go to
node_modules/zone.js/dist/zone.js
.
- 寻找Zone的构造函数:
function Zone(parent, zoneSpec)
- 里面添加以下内容:
this._tasks = {}
- 添加计数器变量全球范围:
let counter = 0
-
寻找Zone.prototype.scheduleTask
并在调用之前添加以下内容this._updateTaskCount(task,1)
:
task.id = counter++;
this._tasks[task.id] = task;
-
寻找Zone.prototype.scheduleTask
并在调用之前添加以下内容this._updateTaskCount(task,-1)
:
delete this._tasks[task.id]
- 重新编译应用程序并运行它
假设您进行了上述调整,您始终可以像这样访问待处理的任务:
tasks = Object.values(window.getAllAngularTestabilities()[0]._ngZone._inner._tasks)
要获取影响可测试性状态的所有挂起的宏任务:
tasks.filter(t => t.type === 'macroTask' && t._state === 'scheduled')
之后与之前的解决方案类似,查看.callback.[[FunctionLocation]]
并通过在角度区域之外运行来修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)