0

だから私のコードは次のようになります。モザテストにスタブ/モックfsを使用させる現実的な方法は何ですか?ディスクにアクセスせずに関数をテストできますか?

import FsAsyncFactory from '../fs/FsAsyncFactory' 
import ObjectHelper from '../utils/ObjectHelper' 
import Config from './Config' 

export class ConfigHelper { 

    // this is the function under test 
    public static async primeCacheObj(): Promise<void> { 

     const configFileObj: any = await ConfigHelper.getConfigFileObj() 

    } 

    private static configCacheObj: Config = null 

    private static async getConfigFileObj(): Promise<any> { 
     const fsAsync: any = FsAsyncFactory.getFsAsync() 
     const fileContents: string = await fsAsync.readFileAsync('./config/hubnodeConfig.json') 

     return JSON.parse(fileContents) 
    } 

} 

export default ConfigHelper 

実際にディスクを打つからそれを停止する私のユニットテストコードを許可するための最良の方法は何ですか?

InversifyJSのようなものを使用して依存性注入を許可するべきですか?私は、アプリケーションが正常に実行されているときに "デフォルト"を設定し、テストでそれらのデフォルトを "上書き"するinitスクリプトを持っていますか?

答えて

1

JavaScriptでは、伝統的に人々はユニットテストを書くのにmonkey patchingを使用していました。

私は個人的にはサルのパッチは悪い習慣であり、維持不能なコードにつながると思います。私は依存性注入を好むので、InversifyJSを作成したのです。

InversifyJSをoverride bindings on unit testsに使用できます。

これは、ConfigHelperが依存性注入によってFsAsyncのインスタンスを取得することを意味します。ユニットテスト中

@injectable() 
export class ConfigHelper { 

    @inject("FsAsync") private readonly _fsAsync: FsAsync; 

    // this is the function under test 
    public static async primeCacheObj(): Promise<void> { 

     const configFileObj: any = await ConfigHelper.getConfigFileObj() 

    } 

    private static configCacheObj: Config = null 

    private static async getConfigFileObj(): Promise<any> { 
     const json = await this_fsAsync.readFileAsync('./xxx.json') 
     return JSON.parse(json) 
    } 

} 

あなたはバインディングFsAsyncタイプを置き換えることができます。

container.bind<FsAsync>("FsAsync") 
     .toDynamicValue(() => FsAsyncFactory.getFsAsync()); 

はモックを注入するには:

container.rebind<FsAsync>("FsAsync") 
     .toDynamicValue(() => ({ 
      readFileAsync: (path) => { 
       return Promise.resolve("{ hardCodedJson: "happy days!" }"); 
      } 
     })); 
+1

ねえ!応答していただきありがとうございます!私はあなたのDIソリューションを試してみましたが、それを稼働させることができませんでした - 私はマシンにいるときに再試行します。ところで、それはビジネスを見ているので、私はそれが動作することを見て興奮しています!乾杯。 –

+0

Hmm ..私はあなたの提案に従ってきましたが、 '式として呼び出されたときにプロパティデコレータの署名を解決できませんでした' @ inject'のTSエラーが発生しました。 'import 'reflect-metadata' 'は私のindex.tsファイルにあり、これはConfigHelperのインポートです。' inject {inject、injectable} 'から 'inversify'' これを使ってinversifyをインストールしました:' npm installは反映メタデータを保存します - セーブ ' これはプロジェクトです:https://github.com/adamdry/node-di-mocha-test アイデア?ありがとう! –

+0

こんにちは、申し訳ありませんが、ここでコードを書いていますが、コンパイルしたり実行したりしていません。問題は '@inject(" FsAsync ")の代わりに' @ inject'をタイプしたということです。私が言ったように、私はコードをコンパイルしていないので多分エラーがありますが、プロジェクトのドキュメントをチェックすると何がうまくいかなかったのか分かるはずです:https://github.com/inversify/InversifyJS/blob/master/README .md#the-basics –

関連する問題