質問: require('../dependency'); // also yuck expect(dependency.dosomething).tobecalledwith(4); }); }); 嬉しいことに、dependency.jsの中の関数がデフォルトのエクスポートであるとき、私は全部がうまくいくようにしたいです。しかし、デフォルトのエクスポートをスパイしてもjasmineではうまくいかないことがわかっています(少なくともうまくいくことはあり得ませんでした)ので、jestでもそれが可能であることを望みません。
回答: 私はimport *を含むハックを使うことによってこれを解決することができました。名前付きとデフォルトの両方のエクスポートでも機能します。名前付きエクスポートの場合:// dependency.js export const dosomething = (y) => console.log(y) // mymodule.js import { dosomething } from './dependency'; export default (x) => { dosomething(x * 2); } // mymodule-test.js import mymodule from '../mymodule'; import * as dependency from '../dependency'; describe('mymodule', () => { it('calls the dependency with double the input', () => { dependency.dosomething = jest.fn(); // mutate the named export mymodule(2); expect(dependency.dosomething).tobecalledwith(4); }); }); またはデフォルトのエクスポートの場合:// dependency.js export default (y) => console.log(y) // mymodule.js import dependency from './dependency'; // note lack of curlies export default (x) => { dependency(x * 2); } // mymodule-test.js import mymodule from '../mymodule'; import * as dependency from '../dependency'; describe('mymodule', () => { it('calls the dependency with double the input', () => { dependency.default = jest.fn(); // mutate the default export mymodule(2); expect(dependency.default).tobecalledwith(4); // assert against the default }); }); mihai damianが以下で非常に正しく指摘しているように、これはdependencyのモジュールオブジェクトを変更しているので、他のテストに「リーク」します。したがって、この方法を使用する場合は、元の値を保存してから、テストごとに元に戻す必要があります。これをjestで簡単に行うには、jest.fn()の代わりに spyon() methodを使用します。元の値を簡単に復元できるので、前述の「リーク」を避けることができます。