单元测试:导入的TypeScript依赖项使用的模拟文档?

时间:2016-12-12 15:34:23

标签: unit-testing typescript mocha proxyquire

我需要以某种方式模拟document对象,以便能够对传统的TypeScript类进行单元测试。该类导入另一个类(View.ts),该类具有{3}的第3方模块,并且反过来导入其他假定存在import的其他类。

我的进口链:

  

controller.ts - > view.ts - > dragula - >交叉 - >定制事件

document

我得到的错误:

  

ReferenceError:未定义文档

尝试使用http://api.jquery.com/html/模仿// Controller.ts: import { View } from './View'; // View.ts: const dragula = require('dragula'); // dragula requires crossvent, which requires custom-event, which does this: module.exports = useNative() ? NativeCustomEvent : 'function' === typeof document.createEvent ? function CustomEvent (type, params) { var e = document.createEvent('CustomEvent'); // ... } : function CustomEvent (type, params) { // ... } // controller.spec.ts: import { Controller } from '../../src/Controller'; ,如下所示:

View

我的问题是,由于beforeEach( () => { viewStub = {}; let view:any = proxyquire('../../src/View', { 'View': viewStub }); viewStub.constructor = function():void { console.log('hello!'); }; }); 语句,即使在View初始化之前,也会弹出错误。

1 个答案:

答案 0 :(得分:1)

如果您在像Node这样没有定义全局文档的环境中运行,您可以创建一个类似这样的存根文档

// ensure-document.ts
if (typeof global !== 'undefined' && !global.document) {
  global.document = {};
}

您需要在导入控制器之前执行此代码,这意味着类似

// controller.spec.ts:
import './ensure-document';

import { Controller } from '../../src/Controller';