在 Jasmine + Angular 中模拟“窗口”对象

Tom*_*ais 7 unit-testing jasmine typescript angular

我有一个要进行单元测试的函数,我正在比较全局对象window& parentas const isEqual = (window === parent);

在 Angular/TypeScript 中模拟这些对象的最佳方法是什么?

另一个想法是通过函数参数获取这些对象,但无论如何它都不能解决这个问题,因为window如果我使用,我也需要模拟全局对象getSomeData(win: Window, parent: Window) { // ... }

Tom*_*ais 5

我采用了这个解决方案:

创建将注入window对象的服务。

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class GlobalObjectService {
  public getWindow(): Window {
    return window;
  }
}
Run Code Online (Sandbox Code Playgroud)

在测试中它看起来像:

describe('TestService', () => {
  ...
  let globalObjectService: jasmine.SpyObj<GlobalObjectService>;

  beforeEach(() => {
    globalObjectService = jasmine.createSpyObj('GlobalObjectService', ['getWindow']);
    ...
  });

  describe('#testFunc', () => {
    it('should test something', () => {
      globalObjectService.getWindow.and.returnValue({
        location: {
          href: 'window.location.href',
        },
      });
      ...
    });
  });
});
Run Code Online (Sandbox Code Playgroud)