私はこのあたりの冗談でデフォルトのエクスポートをあざけることに言及する質問を見てきましたが、これはすでに尋ねられたとは思いません:
テスト中のモジュールの依存関係のデフォルトのエクスポートをモックするときに、モジュールがES6インポートステートメントで依存関係をインポートすると、テストスイートの実行が失敗し、TypeError: (0 , _dependency.default) is not a function
と表示されます。ただし、モジュールが代わりにrequire().default
呼び出しを使用します。
私の理解では、_import module from location
_はconst module = require(location).default
に直接変換されるので、なぜこれが起こっているのか非常に混乱しています。コードスタイルの一貫性を保ち、元のモジュールでrequire
呼び出しを使用しない方がいいです。
それを行う方法はありますか?
モックでファイルをテストする:
_import './modules.js';
import dependency from './dependency';
jest.mock('./dependency', () => {
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();
_
es6 import
またはrequire js
を使用して、jsファイルをjestテストにインポートできます。
es6 import
を使用する場合、jestがすべての依存関係を解決しようとしていること、およびインポートしているクラスのコンストラクターを呼び出していることを知っておく必要があります。このステップでは、模擬できません。依存関係を正常に解決する必要があります。その後、モックを続行できます。
ご覧のとおり、これも追加する必要があります ここ jestデフォルトではjest.mocksをファイルの先頭に移動するため、インポートを配置する順序は重要ではありません。
あなたの問題は異なります。モック関数は、require js
を使用してjsファイルをインクルードしていることを前提としています。
jest.mock('./dependecy', () => {
return {
default: jest.fn()
};
});
require js
を使用してファイルをインポートすると、次のような構造になります。
したがって、require js
を使用して「Test」というクラスをインポートし、「doSomething」というメソッドがあると仮定すると、テストで次のように呼び出すことができます。
const test = require('../Test');
test.default.doSomething();
es6 import
を使用してインポートする場合は、別の方法でインポートする必要があります。同じ例を使用:
import Test from '../Test';
Test.doSomething();
編集:es6 import
を使用する場合は、モック関数を次のように変更します。
jest.mock('./dependecy', () => jest.fn());