2016-09-18 2 views
1

Я пытаюсь использовать поддельный сервер sinon, чтобы издеваться над вызовом jQuery в тесте mocha. но тест всегда дает ошибку, например, jQuery.post не является функцией или что jQuery не определен. Я не понимаю, как импортировать jQuery в jsdom, используя синтаксис es6/es2015.настроить jQuery-тест с jsdom, mocha, es2016

это содержимое тест/setup.js (пакет JQuery NPM был установлен)

import { jsdom } from 'jsdom'; 
import jQuery from 'jquery'; 

var exposedProperties = ['window', 'navigator', 'document']; 

global.document = jsdom(''); 

global.window = document.defaultView 
Object.keys(document.defaultView).forEach((property) => { 
    if (typeof global[property] === 'undefined') { 
    exposedProperties.push(property); 
    global[property] = document.defaultView[property]; 
    } 
}); 

global.jQuery = jQuery; 

global.navigator = { 
    userAgent: 'node.js' 
}; 

Я предполагаю, что после установки фиксирована, я просто должен быть в состоянии использовать jQuery.post() в тесте без изменений там ,

большую часть настроек конфигурации исходит из http://airbnb.io/enzyme/docs/guides/jsdom.html

ответ

0

При загрузке JQuery, он определяет, является ли глобальное пространство окна. Если да, то он экспортирует себя в окно как jQuery и $. Если нет, то то, что оно экспортирует в качестве значения модуля, является функцией установки , с помощью которой вы можете установить jQuery в будущий объект окна. В вашем исходном коде к моменту import jQuery from 'jquery'; пока не используется окно для использования jQuery, поэтому вы можете установить функцию установки, которую вы должны использовать для установки jQuery в окне, как только у вас есть это.

Вот код, который работает. Каждая добавленная или измененная строка комментируется.

import { jsdom } from 'jsdom'; 
import _jQuery from 'jquery'; // Modify this to add the underscore. 

var exposedProperties = ['window', 'navigator', 'document']; 

global.document = jsdom(''); 

global.window = document.defaultView 

const jQuery = _jQuery(window); // Add this line. 

Object.keys(document.defaultView).forEach((property) => { 
    if (typeof global[property] === 'undefined') { 
    exposedProperties.push(property); 
    global[property] = document.defaultView[property]; 
    } 
}); 

global.jQuery = jQuery; 

global.navigator = { 
    userAgent: 'node.js' 
}; 

// This should output "function". 
console.log(typeof jQuery.post); 
Смежные вопросы