Jest を使用して同じモジュール内の関数をモックする
同じモジュール内の関数をモックする場合、Jest のデフォルトのモックの制限を理解することが重要です
問題:
以下の例のように、モジュールをインポートし、そのエクスポートされた関数を直接モックすると、予期しない動作が発生する可能性があります。
// module.js export function bar() { return 'bar'; } export function foo() { return `I am foo. bar is ${bar()}`; } // module.test.js import * as module from '../src/module'; describe('module', () => { let barSpy; beforeEach(() => { barSpy = jest.spyOn(module, 'bar').mockImplementation(jest.fn()); }); it('foo', () => { module.bar.mockReturnValue('fake bar'); expect(module.foo()).toEqual('I am foo. bar is fake bar'); // Fails: Expected "I am foo. bar is fake bar" but received "I am foo. bar is bar" }); });
説明:
上記の例では、fooインポート時に元の bar 関数を直接呼び出します。 barSpy がテスト設定中に正しく更新されていても、foo はモック化されていない bar 関数を参照しているため、不正確な出力が発生します。
解決策 1:
モジュールをインポートする独自のコード ファイル:
この問題を回避するには、 module は独自のコード ファイルにインポートでき、エクスポートされたすべてのエンティティが同じインスタンスから確実にインポートされます。
// module.js export function bar() { return 'bar'; } export function foo() { return `I am foo. bar is ${thisModule.bar()}`; } // module.test.js import * as module from './module'; describe('module', () => { it('foo', () => { spyOn(module, 'bar').and.returnValue('fake bar'); expect(module.foo()).toEqual('I am foo. bar is fake bar'); }); });
この変更された例では、foo はインポートされたインスタンス module.bar を通じて bar にアクセスするようになり、次のことが可能になります。簡単なモック。
解決策 2:
手動インポートをモックします:
または、テスト設定でインポートを手動でモックし、モック化されていないバージョンから分離されたモジュールの新しいインスタンスを作成することもできます。
// module.test.js jest.mock('../src/module'); const * as mockedModule = require('../src/module'); describe('module', () => { beforeEach(() => { mockedModule.bar.mockImplementation(jest.fn()); }); it('foo', () => { mockedModule.bar.mockReturnValue('fake bar'); expect(mockedModule.foo()).toEqual('I am foo. bar is fake bar'); }); });
このアプローチでは、モック化されたインスタンスの mokedModule がテストに使用され、モック化されていないインポートからの干渉を防ぎます。
以上がJest を使用して同じモジュール内の関数を効果的にモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。