javascript - 为单元测试服务 worker 设置 JSDOM navigator.serviceWorker

标签 javascript unit-testing mocha.js service-worker jsdom

我正在寻找一种方法来设置 navigator.serviceWorker 以对我的服务 worker 进行单元测试。我当前的 JSDOM 设置如下所示:

import { JSDOM } from 'jsdom';

const dom = new JSDOM('<!DOCTYPE html><html><head></head><body></body></html>');

global.window = dom.window;
global.document = dom.window.document;

Object.keys(global.window).forEach(property => {
  if (typeof global[property] === 'undefined') {
    global[property] = global.window[property];
  }
});

global.navigator = {
  userAgent: 'node.js'
};

我已经尝试为 global.navigator = global.window.navigator 注释掉 global.navigator = ...。但是,以下 console.log(global.navigator.serviceWorker)console.log(navigator.serviceWorker) 在我的单元中都返回 undefined测试:

describe('Service Worker', () => {
  it('should register a service worker and cache files on install', () => {
    console.log(navigator.serviceWorker); // undefined
    // navigator.serviceWorker.register() // not used yet since undefined
  });
});

最佳答案

使用 Object.defineProperty 方法创建一个新的 serviceWorker 属性:

Object.defineProperty(global.navigator, 'serviceWorker', {
  value: {
    register: jest.fn() // Choose your favourite mocking library
  }
});

register 方法定义为模拟函数,将允许您监视对该函数的调用并返回一个可以解析或拒绝的 promise 。

import sw from './service-worker';

describe('Service worker registration', () => {
  it('call navigator.serviceWorker.register with the right URL', () => {
    expect(navigator.serviceWorker.register).toHaveBeenCalledWith('/service-worker.js');
  });
});

关于javascript - 为单元测试服务 worker 设置 JSDOM navigator.serviceWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44222121/

相关文章:

Angular 2/4 karma 测试

c# - Task.Wait 总是返回 false 尽管任务已完成

javascript - 为什么我的 super 测试调用不会链式?

javascript - 如何模拟返回 promise 的函数并使用确切的参数验证它

javascript - 在两个不同的数组中查找匹配项 - javaScript

javascript获取上一页的url

javascript - 尝试使用 jquery 从元素中删除所有 html

javascript - 尝试导入错误 : 'Routes' is not exported from 'react-router-dom'

PHPUnit - 三叶草覆盖上的 PHP_Token_Stream 错误

node.js - WSL : mocha from sudo apt install mocha crashes with fresh install