2016-12-12 25 views
7

Muszę jakoś przedszkoleć obiekt document, aby móc przetestować starszą klasę TypeScript. Klasa importuje inną klasę (View.ts), która ma import modułu trzeciej strony, a ta z kolei importuje coś innego, co zakłada, że ​​istnieje document.Test jednostkowy: próbny dokument używany przez zaimportowaną zależność od języka TypeScript?

Mój łańcuch importu:

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'; 

Błąd Dostaję:

ReferenceError: document is not defined

Tried mock View z proxyquire coś takiego:

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

}); 

My rzecz w tym błąd pojawia się nawet przed zainicjowaniem View z powodu instrukcji import.

Odpowiedz

1

Jeśli działa w środowisku, jak węzeł, który nie definiuje globalną dokumentu można utworzyć dokument skrótową coś takiego

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

musisz wykonać ten kod przed importem kontroler, który coś znaczy jak

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

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