我正在寻找一种方法来设置 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/