我正在尝试使用sinon的mock和spy来测试Redux组件和异步操作,但是只要我将sinon导入任何测试文件,运行以下npm脚本:
mocha --require test/helpers/browser.js --compilers.:babel-core/register --opts test/client/**/*.{js,jsx} --recursive test/client
我收到以下错误:
var div = typeof document !== "undefined" && document.createElement("div");
^
Run Code Online (Sandbox Code Playgroud)
TypeError:document.createElement不是.../node_modules/sinon/lib/sinon/util/core/deep-equal.js中的函数:3:55
browser.js是我设置JSDOM的地方:
import { JSDOM } from 'jsdom';
const doc = new JSDOM('<!DOCTYPE html><html><head></head><body></body></html>');
cost win = doc.defaultView; // tried doc.window;
global.document = doc;
global.window = win;
/*
Object.keys(win).forEach(property => {
if (typeof global[property] === 'undefined') {
global[property] = win[property];
}
});
*/
global.navigator = {
userAgent: 'node.js'
};
Run Code Online (Sandbox Code Playgroud)
我想我没有正确设置jsdom?我试着环顾四周,在上面的browser.js文件中找到了注释代码,但是在取消注释时会产生错误:
Object.keys(win).forEach(function (property) {
^
Run Code Online (Sandbox Code Playgroud)
TypeError:无法将undefined或null转换为object.
我正在寻找一种方法来设置 navigator.serviceWorker 来对我的 service 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'
};
Run Code Online (Sandbox Code Playgroud)
我已经尝试注释掉global.navigator = ...了global.navigator = global.window.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); …Run Code Online (Sandbox Code Playgroud) 我有一个加载indexedDB 的类。在类中的方法可以访问它之前,我需要预先加载indexedDB。目前,我使用的init()方法先于任何其他未this.db初始化的方法。
我正在寻找一种更干净的方法来实现我所拥有的,这绝对不是干的。基本上每个方法目前都是使用下面相同的代码模式实现的。
问题点是:
init()才能正确处理indexedDB的初始化。if (!this.db) {片段稍后会重复出现。export default class Persist {
constructor(storage) {
if (storage) {
this.storage = storage;
}
else {
throw new Error('A storage object must be passed to new Persist()');
}
}
// needed to ensure that indexedDB is initialized before other methods can access it.
init () {
// initialize indexedDB:
const DBOpenRequest = this.storage.open('db', 1);
DBOpenRequest.onupgradeneeded = () => {
const db = DBOpenRequest.result;
db.createObjectStore('db', …Run Code Online (Sandbox Code Playgroud) javascript ×4
jsdom ×2
mocha.js ×2
node.js ×2
github ×1
indexeddb ×1
npm ×1
redux ×1
unit-testing ×1