web-dev-qa-db-ja.com

デフォルトのエクスポートをあざけるジェスト-必要とインポート

私はこのあたりの冗談でデフォルトのエクスポートをあざけることに言及する質問を見てきましたが、これはすでに尋ねられたとは思いません:

テスト中のモジュールの依存関係のデフォルトのエクスポートをモックするときに、モジュールが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();
_
9
Anna Melzer

es6 importまたはrequire jsを使用して、jsファイルをjestテストにインポートできます。

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

ご覧のとおり、これも追加する必要があります ここ jestデフォルトではjest.mocksをファイルの先頭に移動するため、インポートを配置する順序は重要ではありません。

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

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

require jsを使用してファイルをインポートすると、次のような構造になります。

enter image description here

したがって、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());
10