使用Mocha对使用Typescript的Jquery进行unit testing时如何修复“$ is not defined”错误?
我正在为包含Jquery的 Typescript代码编写Mochaunit testing。 我正在使用jsdom来获取文档对象。 当我将我的TS代码编译为JS并运行测试时,它会抛出一个错误[ReferenceError:$未定义] 。
我的Typescript代码在这里
export function hello(element) : void { $(element).toggleClass('abc'); };
我的unit testing代码如下:
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(); }); });
当我运行Mocha测试它显示
也尝试使用global。$ = require(“jquery”); 但不起作用。
jQuery必须全局可用,因为您的脚本从全局空间获取它。 如果我修改你的代码,以便var $ = require('jquery')(window);
被替换为:
global.$ = require('jquery')(window);
然后它工作。 注意两个调用:1st要求jquery
,然后通过传递window
来构建它。 你也可以这样做:
global.window = window global.$ = require('jquery');
如果window
全局可用,那么就不需要像第一个片段那样执行双重调用:jQuery只使用全局可用window
。
您可能还想定义global.jQuery
因为有些脚本依赖于它的存在。
以下是运行的测试文件的完整示例:
/// /// /// /// 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(); }); });
使用tsd
以通常的方式获得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'); };
您需要首先在Node中包含jsdom和jQuery:
npm install jsdom --save-dev npm install jquery --save-dev
如果您不能或不想更改全局命名空间类型定义,您仍然可以包含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);
如上所述,您应该正确导入jQuery: import $ = require('jquery');