首页 > 解决方案 > 如何在单元测试角度代码时模拟窗口导航器对象

问题描述

我正在使用 jasmine 编写 Angular 的单元测试。该方法使用 window.navigator 属性。该属性在方法之外定义,如下所示

declare var navigator: any;
navigator = window.navigator;

在要测试的方法中,存在以下要测试的代码

let locale = navigator.language || navigator.userLanguage || navigator.browserLanguage; 

第一个条件navigator.language在运行单元测试时自动覆盖。我想涵盖此代码的所有分支,即,我想在测试时涵盖所有 OR 条件。如何在单元测试中模拟导航器?

标签: angularunit-testingjasmine

解决方案


我创建了一个方法来返回导航器,而不是直接引用它,然后在规范文件中模拟了相同的方法。

在 component.ts 文件中 -

// method that returns navigator object
public getNavigatorReference(): any {
    return navigator;
}

// method that uses the above method
private methodThatUsesNavigator(): void {
   let navigatorReference = this.getNavigatorReference();
   let locale = navigatorReference.language || navigatorReference.userLanguage || 
   navigatorReference.browserLanguage;
...
}

在规范文件中 -

Object.defineProperty(navigator, 'userLanguage', {
      get: function () { return 'en'; }
});

推荐阅读