angular - 如何在单元测试角度代码时模拟窗口导航器对象
问题描述
我正在使用 jasmine 编写 Angular 的单元测试。该方法使用 window.navigator 属性。该属性在方法之外定义,如下所示
declare var navigator: any;
navigator = window.navigator;
在要测试的方法中,存在以下要测试的代码
let locale = navigator.language || navigator.userLanguage || navigator.browserLanguage;
第一个条件navigator.language
在运行单元测试时自动覆盖。我想涵盖此代码的所有分支,即,我想在测试时涵盖所有 OR 条件。如何在单元测试中模拟导航器?
解决方案
我创建了一个方法来返回导航器,而不是直接引用它,然后在规范文件中模拟了相同的方法。
在 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'; }
});
推荐阅读
- ionic4 - Ionic 4 应用程序 - 检测用户是否关闭或打开 gps
- snowflake-cloud-data-platform - 在雪花中转义双引号
- python - 下载 MNIST 数据集时出现“HTTP 错误 403:禁止”错误
- c# - 异步套接字客户端一旦连接到第三方软件,就会继续监听传入的消息
- javascript - 在 keydown 的断点处停止时未触发 Javascript keyup
- html - 分页后是否可以重复内容?你能检测到分页符吗?
- javascript - 添加/删除类而不是单击时删除类
- swiftui - 颜色变化动画
- docker - bitbucket 管道错误 - 容器 'docker' 超出内存限制
- google-cloud-platform - 如何在不提交服务密钥的情况下使用服务密钥向 gcloud SDK 进行身份验证?