2017-11-01 21 views
1

対必要テストされているモジュールの依存関係がない場合、モジュールがES6インポートステートメントで依存関係をインポートした場合、テストスイートは実行されません。TypeError: (0 , _dependency.default) is not a functionこの場合、モジュールはrequire().default呼び出しを代わりに使用します。冗談は私がここの周りに冗談を持つデフォルトの輸出のモックを参照の質問を見てきましたが、私は、これはすでに求められているとは思わない輸入

私の理解では、import module from locationconst module = require(location).defaultに直接変換されるので、なぜこれが起こっているのか非常に混乱しています。私はむしろ私のコードスタイルを一貫性を保ち、元のモジュールでrequireコールを使用しないでください。

これを行う方法はありますか?モックと

テストファイル:(動作しない)

import './modules.js'; 
import dependency from './dependency'; 

jest.mock('./dependecy',() => { 
    return { 
     default: jest.fn() 
    }; 
}); 

// This is what I would eventually like to call 
it('calls the mocked function',() => { 
    expect(dependency).toHaveBeenCalled(); 
}); 

Dependency.js

export default() => console.log('do something'); 

module.js(作業)

import dependency from './dependency.js'; 
dependency(); 

module.js

const dependency = require('./dependency.js').default; 
dependency(); 
+0

'jest.mock'から別のモジュールで起こっ' dependency'呼び出しですコール? – MinusFour

+0

should 'jest.mock(' ./ dependecy '、()=> jest.fn()); 'どちらの場合でも動作しますか? –

+0

テストファイルのコードを更新して、モジュールがインポートされ、実行されていることをテストしていることを示しました。 –

答えて

2

jestテストでjsファイルをインポートするには、es6 importまたはrequire jsのいずれかを使用できます。

es6 importを使用している場合は、jestがすべての依存関係を解決しようとしていることと、インポートするクラスのコンストラクタも呼び出す必要があります。このステップでは、モックはできません。依存関係を正常に解決してから、モックを続行できます。

また、here jestはデフォルトでjest.mocksをファイルの先頭に巻き上げるので、インポートを配置する順序は重要ではありません。

あなたの問題は異なります。あなたの疑似関数は、require jsを使ってjsファイルをインクルードしたことを前提としています。

jest.mock('./dependecy',() => { 
    return { 
     default: jest.fn() 
    }; 
}); 

あなたがrequire jsを使用してファイルをインポートすると、これはそれが持っている構造である。

enter image description here

をだから私はrequire jsを使用して「テスト」と呼ばれる私のクラスをインポートしている、そしてそれはメソッドが呼び出されたと仮定すると"doSomething"私のテストでは、次のようにして呼び出すことができます:

const test = require('../Test'); 
test.default.doSomething(); 

es6 import、あなたはそれを別の方法で行うべきです。同じ例を使用する:

import Test from '../Test'; 
Test.doSomething(); 

EDITを:あなたがあなたのモック機能を変更es6 import使用する場合:

jest.mock('./dependecy',() => jest.fn()); 
+0

私がテストしているモジュールは、クラスなどをまったくエクスポートしていません。私はそれを示すためにコードを更新しました。しかし、デフォルトのエクスポートを持つモジュールがimport/requireされています。 –

+0

私のモジュール*は、依存関係es6スタイルをインポートする必要があります。模擬が 'require js'を予期している場合、どうすれば' es6 import'を期待できますか? –

+0

@AnnaMelzer私はあなたの模擬機能がどのようにすべきかと私の答えを編集しました。 –

関連する問題