2016-12-12 9 views
7

documentオブジェクトを何とか模擬して、従来のTypeScriptクラスを単体テストできるようにする必要があります。クラスは、第三者モジュールのimportを持つ別のクラス(View.ts)をインポートし、次に、documentが存在すると仮定して別のクラスをインポートします。ユニットテスト:インポートされたTypeScript依存関係によって使用されるモックドキュメントですか?

輸入のマイチェーン:

proxyquireとモック Viewをしようとしました

ReferenceError: document is not defined

を、次のように:

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

}); 

私の私が取得しています

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

エラー問題はimportステートメントのために、Viewが初期化される前にそのエラーがポップアップします。

答えて

1

あなたが何かを意味し、コントローラをインポートする前にこのコードを実行する必要があり、この

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

ようなものでスタブ文書を作成することができるグローバルな文書を定義していないノードのような環境で実行している場合like

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

import { Controller } from '../../src/Controller'; 
関連する問題