2016-11-10 10 views
0

ファイルだから私は依存関係を持っている:私は前にDEPの関数を呼び出すには、ファイルシステムをモック場合依存関係のロード&システムモッキング

dep = require('dep') 

、DEPがからエクスポートされたファイルが見つかりません。

mockFs({}) 
dep.bar() #file where dep exported from not found 

depをエクスポートしたファイルを模倣する前に関数を呼び出すと、その関数が呼び出されます。

dep.foo() 
mockFs({}) 
dep.bar() #works 

この動作の原因は何ですか?

答えて

0

require()あなたのrequire()コールはキャッシュされていますので、実際にと呼ばれる可能性があるため、は実際のファイルシステムを使用しています。後でfsのモック

require('fs')への新しい呼び出しがモックを使用することを意味するが、すでにロードされているものは影響を受けません。

+0

ありがとうございます!それを先に進ませてロードするためのあらゆる考え? dep.foo()を事前に呼び出すと他の関数もロードされるようです。 – Drew

+0

これはユニットテストとモックに関するトリッキーな部分です - ファイルのロード順です!通常、すべての 'require()'はすべてのファイルの先頭にあるので、最初のテストファイル(そして最初のモック)が実行される前に、すべてのファイルが最初にロードされるので、いくつかの模倣ライブラリには、既存の機能を引き継ぐことができる「スパイ」、または要求キャッシュがあります。また、 'require()'呼び出しが呼び出される場所を変更して、それらを効果的に擬似することができます。 – clay

+0

上記のシナリオ2で2番目の関数を呼び出すときに依存関係に関連するファイルに関して私が説明していなかったことについての考えはありますか?すべてのコードの前に依存関係が必要です。そしてありがとう! – Drew