最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Setting up JSDOM navigator.serviceWorker for unit testing service workers - Stack Overflow

programmeradmin6浏览0评论

I'm looking for a way to set up navigator.serviceWorker to unit test my service worker. My current JSDOM setup looks like this:

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'
};

I've already tried menting out global.navigator = ... for global.navigator = global.window.navigator. However, the following console.log(global.navigator.serviceWorker) and console.log(navigator.serviceWorker) both return undefined in my unit test:

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
  });
});

I'm looking for a way to set up navigator.serviceWorker to unit test my service worker. My current JSDOM setup looks like this:

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'
};

I've already tried menting out global.navigator = ... for global.navigator = global.window.navigator. However, the following console.log(global.navigator.serviceWorker) and console.log(navigator.serviceWorker) both return undefined in my unit test:

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
  });
});
Share Improve this question asked May 27, 2017 at 22:22 mytherealmythereal 8031 gold badge10 silver badges23 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 10

Use Object.defineProperty method to create a new serviceWorker property:

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

Defining register method as a mock function, will allow you to spy the calls made to that function and also return a promise that can be resolve or reject.

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');
  });
});
发布评论

评论列表(0)

  1. 暂无评论