使用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');