首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试承诺内动态导入角

测试承诺内动态导入角
EN

Stack Overflow用户
提问于 2022-03-29 09:03:24
回答 2查看 84关注 0票数 0

我有这样的代码:

component.ts

代码语言:javascript
复制
async ngOnInit() {
   import('dom-to-image').then(module => {
      const domToImage = module.default;
      const node = document.getElementById('some-id');
      domToImage.toPng(node).then(dataUrl => {
          // The test is not getting over here
      }).catch(() => {});
   });
}

component.spec.ts

代码语言:javascript
复制
describe('SomeComponent', () => {
  beforeEach(
    waitForAsync(() => {
      TestBed.configureTestingModule({
           ....
      }).compileComponents();
      fixture = TestBed.createComponent(SomeComponent);
      component = fixture.componentInstance;
      fixture.detectChanges();
    })
  )

  it('should create', async () => {
    expect(component).toBeTruthy();
  });
}

所以问题是,我如何嘲弄这个承诺domToImage.toPng?是否有解决方案使测试能够继续执行并解决承诺?

提前谢谢伊斯玛

EN

回答 2

Stack Overflow用户

发布于 2022-03-29 09:13:58

您必须模拟module.default:

代码语言:javascript
复制
module.default = {
    toPng: () => new Promise((resolve, reject) => {resolve('myExpectedResponseData')})
};

以及错误测试中的模拟调用拒绝。注意:如果不能直接模拟module.default,请尝试spyOnProperty

票数 0
EN

Stack Overflow用户

发布于 2022-03-29 13:01:31

我记得我也遇到了类似的问题,我无法在import上进行间谍活动来嘲笑它。

为了让测试开心,我把它移到了它自己的方法上,我观察到了这个方法。

代码语言:javascript
复制
async ngOnInit() {
   importDomToImage().then(module => {
      const domToImage = module.default;
      const node = document.getElementById('some-id');
      domToImage.toPng(node).then(dataUrl => {
          // The test is not getting over here
      }).catch(() => {});
   });
}

importDomToImage(): Promise<any> { // can make any more specific
  return import('dom-to-image');
}

第一个fixture.detectChanges()是在调用ngOnInit()时,所以我们必须在此之前进行模拟。

代码语言:javascript
复制
describe('SomeComponent', () => {
  beforeEach(
    waitForAsync(() => {
      TestBed.configureTestingModule({
           ....
      }).compileComponents();
      fixture = TestBed.createComponent(SomeComponent);
      component = fixture.componentInstance;
      // mock here
      spyOn(component, 'importDomToImage').and.returnValue(Promise.resolve({
        default: {
           toPng: (arg) => Promise.resolve('abc'), // dataUrl will be abc
        }
      }));
      fixture.detectChanges();
    })
  )

  it('should create', async () => {
    // await fixture.whenStable() to resolve all promises
    await fixture.whenStable();
    expect(component).toBeTruthy();
  });
}

希望上面的这些都能让你开始工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71659232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档