如何移除用于单元测试的窗口/导航器JS API

How to remove a window / navigator JS API for unit testing?

本文关键字:导航 JS API 窗口 何移 用于 单元测试      更新时间:2023-09-26

当浏览器中不存在API时,我想测试库的行为。

例如,如果我有以下检查:

if ('serviceWorker' in navigator &&
'PushManager' in window &&
'Notification' in window &&
'showNotification' in ServiceWorkerRegistration.prototype) {
   // Do something
} else {
   throw new Error('Catch in test');
}

是否可以完全删除这些全局作用域上的属性?

是否可以完全删除这些全局作用域上的属性?

据我所知不是。一种解决方案是使代码独立于全局范围。

将这个特性检查包装成一个函数,将这些对象基元作为参数,然后在测试中模拟它们。

function initServiceWorker(window, navigator) {
  if ('serviceWorker' in navigator &&
    'PushManager' in window &&
    'Notification' in window &&
    'showNotification' in ServiceWorkerRegistration.prototype) {
    // Do something
  } else {
    throw new Error('Catch in test');
  }
}
initServiceWorker(window, navigator)
alert("first test passed")
initServiceWorker(window, {})