Как исправить ошибку "$ is not defined " при модульном тестировании Jquery с Typescript с помощью Mocha?
Я пишу Mocha юнит-тесты для Typescript кода, содержащего Jquery. Я использую jsdom для получения объекта document. Когда я компилирую свой код TS в JS и запускаю тесты, он выдает ошибку [ReferenceError: $ is not defined].
Мой код машинописи здесь
export function hello(element) : void {
$(element).toggleClass('abc');
};
Мой модульный тестовый код выглядит следующим образом:
import {hello} from '../src/dummy';
var expect = require('chai').expect;
var jsdom = require('jsdom');
var document = jsdom.jsdom();
var window = document.defaultView;
var $ = require('jquery')(window);
describe('TEST NAME', () => {
it('should run', (done) => {
hello($('div'));
done();
});
});
Когда я запускаю тест Мокко, он показывает
<failure message="$ is not defined"><![CDATA[ReferenceError: $ is not defined ...
]]></failure>
Также попробовал использовать global.$ = require ("jquery"); но не работает.
4 ответов:
JQuery должен быть доступен глобально, потому что ваш скрипт получает его из глобального пространства. Если я изменю ваш код так, что
var $ = require('jquery')(window);будет заменено на:global.$ = require('jquery')(window);Тогда это работает. Обратите внимание на два вызова: 1-й, чтобы потребовать
jquery, а затем построить его путем передачиwindow. Вы могли бы альтернативно сделать:global.window = window global.$ = require('jquery');Если
windowдоступен глобально, то нет необходимости выполнять двойной вызов, как в первом фрагменте: jQuery просто использует глобально доступныйwindow.Вы, вероятно, тоже хотите определите
global.jQuery, так как некоторые скрипты рассчитывают на его присутствие.Вот полный пример тестового файла, который выполняется:
/// <reference path="../typings/mocha/mocha.d.ts" /> /// <reference path="../typings/chai/chai.d.ts" /> /// <reference path="../typings/jsdom/jsdom.d.ts" /> /// <reference path="./global.d.ts" /> import {hello} from './dummy'; import chai = require('chai'); var expect = chai.expect; import jsdom = require('jsdom'); var document = jsdom.jsdom(""); var window = document.defaultView; global.window = window global.$ = require('jquery'); describe('TEST NAME', () => { it('should run', (done) => { hello($('div')); done(); }); });Файлы
typingsполучаются обычным способом с помощьюtsd. Файл./global.d.tsустраняет проблему, которую вы можете получить, установив новые значения наglobal. Он содержит:declare namespace NodeJS { interface Global { window: any; $: any; } }
dummy.jsбыл также изменен следующим образом:declare var $: any; export function hello(element) : void { $(element).toggleClass('abc'); };
Сначала необходимо включить jsdom и jQuery в узел:
npm install jsdom --save-dev npm install jquery --save-devА затем добавьте эти строки в свой .JS файл, в котором вы используете jQuery
const jsdom = require("jsdom"); const { JSDOM } = jsdom; const { window } = new JSDOM(`...`); var jQuery = require('jquery')(window); var example = (function($) { .....your jQuery code.... })(jQuery); module.exports = example;
Если вы не можете или не хотите изменять определение типа глобального пространства имен, вы все равно можете включить jQuery следующим образом:
const globalAny:any = global; const $ = globalAny.$ = require('jquery')(window);Полная инициализация jQuery тогда становится:
const jsdom = require("jsdom"); const { JSDOM } = jsdom; const { window } = (new JSDOM()); const globalAny:any = global; const $ = globalAny.$ = require('jquery')(window);
Comments