angular - 无法在 Jest 中模拟 Renderer2
问题描述
试图在 Jest 环境中模拟 Renderer2 并且无法使其工作。Jest 23 & Angular 7. 尝试了一切:
组件.ts
const icosahedron = document.getElementById('renderIcosahedron');
this.renderer2.appendChild(icosahedron, this.renderer.domElement);
一直得到错误(仅在测试中):
TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
编辑:更详细的解释已添加到 Angular 的存储库中,但它被视为错误而被拒绝。链接:https ://github.com/angular/angular/issues/30865#issue-452458779
解决方案
您可以调用组件构造函数,而不是从 TestBed 创建组件对象,
const renderer2 = { setStyle: () => {}, removeStyle: () => {} } as any;
const myComponent: MyComponent= new MyComponent(
{} as ChangeDetectorRef,
renderer2 as Renderer2,
{} as NgZone
);
const setStyleSpy = jest.spyOn(renderer2, "setStyle");
让我们说,如果应该在异步调用中调用 renderer2 逻辑,我们可以模拟该异步调用函数并测试发生异步操作时是否调用了该函数。然后该函数可以作为其他规范的一部分单独调用并测试渲染逻辑。
推荐阅读
- ios - 如何在 React Native 中更改 iOS/Android 项目文件夹
- javascript - 获取同一类的多个下拉列表的选定索引
- univocity - 使用例程的 Univocity 解析器使用 defaultNullRead 属性忽略 LongCoversion?
- netty - 当对 netty 服务器发出请求时,不会调用 ChannelRead 方法
- android - 我如何知道何时需要在 RxJava 中处理一次性用品?
- python - 如何处理 CSV 文件中引号字符中的引号字符?
- database-connection - 无法使用 Netbeans 或 ij 连接 derby 数据库的备份
- prolog - Prolog中N个相关事件的析取概率
- javascript - 如何通过单击 iframe 中的按钮将用户重定向到另一个页面
- string - 处理 Splunk 过滤器中的特殊字符