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

时间:2018-08-21 13:12:49

标签: angular typescript unit-testing jasmine

我有一个要进行单元测试的功能,正在将全局对象np.uint8windowparent进行比较;

哪种方法是在Angular / TypeScript中模拟那些对象的最佳方法?

还有一个想法是通过函数参数获取这些对象,但是无论如何它并不能解决这个问题,因为如果我使用const isEqual = (window === parent)

,我也需要模拟全局window对象

1 个答案:

答案 0 :(得分:1)

我采用了这种解决方案:

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

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

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

在测试中,它看起来像:

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',
        },
      });
      ...
    });
  });
});