2017-05-27 113 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'); 
    }); 
});