2017-05-27 33 views
0

我正在寻找一种方法来设置navigator.serviceWorker来单元测试我的服务人员。我目前的JSDOM设置是这样的:设置JSDOM navigator.serviceWorker为单元测试服务人员

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

回答

0

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

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

定义register方法作为模拟功能,可以让你监视对该功能的调用,并返回可以解决或拒绝的承诺。

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