3

config.tsノードで実行されるTypeScript ファイルがあります。

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

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

他の TypeScript ファイルでは、importこのファイルを完全なタイプ セーフで実行できます。

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

ここで、このスクリプトの単体テストを行います。このスクリプトrequire()の依存関係を模倣するために、私はproxyquireを使用しています。これにより、スクリプトが を呼び出すときに取得する値を提供できますrequire()。私のテストは次のようになります。

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();

の代わりに使用しているため、config変数の型が. TypeScript は、モジュール解決を実行できるように、関数に特別な処理を与える必要があります。のように、モジュールの解決も行う必要がある TypeScript コンパイラに指示する方法はありますか?anyproxyquire()require()require()proxyquire()require()

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

4

1 に答える 1

1

config.ts回避策があります-実際のモジュールをインポートtypeofし、型キャストで使用することにより、モジュールの型を取得できます。

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

テストで同じモジュールを 2 回インポートする必要があるため、これは理想的ではありません。実際のモジュールはそのタイプを取得するためのものであり、「proxiquired」モジ​​ュールはテストで実際に使用するためのものであり、混同しないように注意する必要があります。二つ。しかし、typescript のモジュール解決の別のバリアントを実装するタスクと比較すると、かなり単純です。また、configType がこのように使用される場合 (入力のみ)、そのインポートは生成された javacsript コードに表示されません。

于 2016-10-20T21:50:53.257 に答える