angular - Okta 登录小部件打破了 Jest 测试 - TypeError:无法读取 null 的属性“backingStorePixelRatio”
问题描述
如标题所示。
在 Okta 开发论坛https://devforum.okta.com/t/okta-sign-in-widget-breaks-neutrino-jest-tests/2874上发现了这个问题,作者提到将canvas-prebuilt
npm 包添加到 devDependencies 为他解决了这个问题.
可悲的是它对我不起作用。
有人在使用 Okta 登录小部件时遇到此错误吗?
我正在使用 Jest 23.x 和这两个 npm 包,它们帮助我将 Okta 登录小部件集成到我的 Angular 应用程序中。
- "@okta/okta-angular": "^1.2.1",
- "@okta/okta-signin-widget": "^2.19.0",
一切正常 - 我可以成功登录和退出 - 除了运行 Jest 测试时出现错误。
编辑:我还发现了这个 Github 问题https://github.com/cssivision/qrcode-react/issues/15这似乎与我的问题有些相关,但解决方案仍然无法解决。
第二次编辑:
这是完整的错误堆栈
console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
Error: Not implemented: HTMLCanvasElement.prototype.getContext (without installing the canvas npm package)
at module.exports (C:\Users\18790\source\Workspaces\ionComplianceUI\node_modules\jsdom\lib\jsdom\browser\not-implemented.js:9:17)
at HTMLCanvasElementImpl.getContext (C:\Users\18790\source\Workspaces\ionComplianceUI\node_modules\jsdom\lib\jsdom\living\nodes\HTMLCanvasElement-impl.js:42:5)
at HTMLCanvasElement.getContext (C:\Users\18790\source\Workspaces\ionComplianceUI\node_modules\jsdom\lib\jsdom\living\generated\HTMLCanvasElement.js:50:45)
at getContext (C:\Users\18790\source\Workspaces\ionComplianceUI\node_modules\@okta\okta-signin-widget\dist\js\webpack:\packages\@okta\qtip2\dist\jquery.qtip.js:2078:50)
at Object.<anonymous> (C:\Users\18790\source\Workspaces\ionComplianceUI\node_modules\@okta\okta-signin-widget\dist\js\webpack:\packages\@okta\qtip2\dist\jquery.qtip.js:2077:24)
FAIL src/app/ion-okta-auth/login/__tests__/login.component.spec.tsules\@okta\okta-signin-widget\dist\js\webpack:\packages\@okta\qtip2\dist\jquery.qtip.js:22:3
这个Github 问题和进一步的调查使我找到了jest-canvas-mock npm 包,该包需要添加为 devDependency 并使用 package.json 中的 jest setupFiles 数组进行设置——但我再次看到相同的错误消息。
解决方案
我所要做的就是安装 jest canvas mock
npm i jest-canvas-mock
将此添加到 package.json
"jest": {
"setupFiles": ["jest-canvas-mock"]
}
使用创建反应应用程序。
推荐阅读
- python - PyGObject:小部件如何维护对信号处理程序的引用?
- c++ - 使用模板函数在类中初始化静态字符数组,给出未定义的引用
- knockout.js - 如何在淘汰赛js中添加多行注释
- flutter - Flutter - 了解 Provider、Bloc 的生命周期以及何时处置流
- android - 使用 TouchAction 依次单击两个按钮
- html - 将谷歌标签管理器代码放在网站头标签中是否重要
- php - 通过 XAMPP PHP 未定义函数 sqlsrv_connect 连接到 MS SQL Server
- eclipse - 在 Elipse 中重新排列代码的快捷方式是什么?
- ios - UITextView 的 UIGestureRecognizer 防止键盘在点击时出现
- java - 混淆 JAR 是否足以阻止普通最终用户而不是专家黑客理解 JAVA 代码?