7

document従来の TypeScript クラスを単体テストできるようにするには、何らかの方法でオブジェクトをモックする必要があります。このクラスは、サードパーティ モジュールのを持つ別のクラス ( View.ts) をインポートし、次に、存在すると想定される別のものをインポートします。importdocument

私の輸入チェーン:

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

私が得ているエラー:

ReferenceError: ドキュメントが定義されていません

次のように、 proxyquireでモックViewを試みました。

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

});

私の問題は、ステートメントViewが原因で、が初期化される前でもエラーがポップアップすることです。import

4

1 に答える 1

1

グローバル ドキュメントを定義しない Node のような環境で実行している場合は、次のようなものでスタブ ドキュメントを作成できます。

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

コントローラーをインポートする前に、このコードを実行する必要があります。これは、次のようなことを意味します

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

import { Controller } from '../../src/Controller';
于 2016-12-18T14:33:55.300 に答える