2016-10-20 3 views
2

私はノードで実行されますtypescriptファイルconfig.tsありますTypeScriptでrequire()の代わりにカスタムモジュール解決関数( "proxyquire"など)を使用できますか?

import config = require('./config'); 
config.doSomething(); 
config.doSomethingElse(); // compiler error, this method doesn't exist 

今、私はユニットテストしたい:私は完全な型の安全性とimportこのファイルすることができ、他のtypescriptファイルで

import myDependency = require('my-dependency');  

export = { 
    doSomething =() => { 
     ... 
    } 
} 

をこのスクリプト。このスクリプトの依存関係を模擬するために、require()を呼び出したときにスクリプトが取得する値を提供するためにproxyquireを使用しています。これは私がrequire()の代わりにproxyquire()を使用していますので、私のconfig変数の型anyであることを除いて、正常に動作します

import proxyquire = require('proxyquire'); 
const config = proxyquire('./config', { 
    'my-dependency': {} // this mocked object will be provided when config.ts asks for `my-dependency` 
}); 

expect(config.doSomething()).to.do.something(); 

:ここでは私のテストはどのように見えるかです。 TypeScriptは、モジュール解決を実行できるように、require()関数に特別な処理を与える必要があります。 TypeScriptコンパイラにproxyquire()も同様にモジュール解決を行うべきであることを伝える方法はありますか?require()に似ていますか?

config.tsをクラスとして書き換えたり、インターフェイスを使用したりすることができます。次に、クラス/インタフェースの定義をインポートして、テストで明示的に変数をタイプすることができます。しかし、proxyquire()を暗黙のうちに入力することは、もっと簡単な解決策になります。

答えて

0

回避策はあり - あなたは実際のモジュールをインポートし、型キャストでtypeofを使用してconfig.tsモジュールの種類を取得することができます:あなたはあなたの中に同一のモジュールをインポートする必要があるため

import proxyquire = require('proxyquire'); 

import configType = require('./config'); 

const config = <typeof configType> proxyquire('./config', { 
    'my-dependency': {} // this mocked object will be provided when config.ts asks for `my-dependency` 
}); 

config.doSomething(); 

// config.noSuchMethod(); // does not compile 

は、これは理想的ではありません実際にあなたのテストで使用するためには、実際にそのタイプのものと "proxiquired"のものを得るための本当のものと、2つのものを混ぜないように注意する必要があります。しかし、これは、typescriptのためのモジュール解決の別の変種を実装する作業と比べてかなり簡単です。また、configTypeがこのように使用される場合(入力のみの場合)、そのインポートは生成されたjavacスクリプトコードには表示されません。

関連する問題