【问题标题】:How to mock a function whose parent object is of nullable type?如何模拟其父对象为可空类型的函数?
【发布时间】:2021-10-08 22:02:55
【问题描述】:

这是我的方法。

redirect(){
   const url = 'localhost:4100';
   this.document.defaultView?.open(url, '_blank'); 
}

显然 open() 存在于 defaultView 中。但是,当我尝试模拟它时,我收到一个错误 open is not part of this object。

const spyOpen = spyOn(document.defaultView, 'open').and.callFake(
  (url: string, target: string = '_blank'): void => {
    url;
    target;
  }
);

【问题讨论】:

  • Jest 还是 Jasmine?这是一个或另一个。
  • 我更喜欢开玩笑。但如果我能在 Jasmine 中解决这个问题,那已经是了。

标签: angular jestjs karma-jasmine angular-spectator


【解决方案1】:

在 Jest 中,它可以是:

jest.spyOn(document.defaultView as Required<typeof document.defaultView>, 'open')

问题是,如果document.defaultView.open在运行时真的不是一个函数,Jest将无法对其进行spy,此时它无法利用Jest维护的spie,需要手动清理:

originalOpen = document.defaultView.open;
document.defaultView.open = jest.fn();

// in afterEach
document.defaultView.open = originalOpen;

同样适用于 Jasmine,根据 API 的差异进行调整。

【讨论】:

  • 你的意思是应该是document.defaultView?.open = jest.fn(); defaultView 实际上是可以为空的。
  • 那就是document.defaultView!.open。如果 defaultView 不是对象,它将在运行时失败。
  • 使用感叹号,我收到此错误Forbidden non-null assertion.
  • 值得一提的是错误的来源。是棉绒,不是吗?然后让它静音,因为在这种情况下这是正确的做法。
  • 我们不能让 linter 保持沉默。我不得不将测试分成 2 个描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多