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

mon*_*ist 7 unit-testing mocha.js typescript proxyquire

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

我的进口链:

controller.ts - > view.ts - > dragula - > crossvent - > custom-event

// 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';
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

ReferenceError:未定义文档

尝试View使用proxyquire模拟,如下所示:

beforeEach( () => {
    viewStub = {};
    let view:any = proxyquire('../../src/View', { 'View': viewStub });
    viewStub.constructor = function():void { console.log('hello!'); };

});
Run Code Online (Sandbox Code Playgroud)

我的问题是View,由于import语句的原因,即使在初始化之前,错误也会弹出.

Alu*_*dad 1

如果您运行在像 Node 这样没有定义全局文档的环境中,您可以使用如下内容创建存根文档

// ensure-document.ts
if (typeof global !== 'undefined' && !global.document) {
  global.document = {};
}
Run Code Online (Sandbox Code Playgroud)

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

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

import { Controller } from '../../src/Controller';
Run Code Online (Sandbox Code Playgroud)