ES Modulesなモジュールをモックする
まとめ
一旦、jest.mock もしくは vi.mock をつかってテストのときだけモジュールを書き換え可能なモックにしよう
code:ts
vi.mock('something')
// あとはテストケースの中でいつもどおり spyOn する
it('something', () => {
vi.spyOn(something, 'foo').mockResolvedValue({ ... })
})
簡単な説明
Jest や Vitest で ESM なモジュールをモックする必要がある場合、いきなり spyOn を使うと以下のエラーとなる。 例: TypeError: Cannot redefine property: xxxx
対応策では jest.mock もしくは vi.mock を使ってロードするモジュールをモックに差し替え、モックの中身はもともとのモジュールの内容をそのまま展開する。
@ts-ignore はスプレッド演算子をモジュールに対して使用すると発生する TypeScript 的な型エラーを意図的に無視するためにおいている (参照: TS2488) 2022-05-09 追記
Vite の場合 0.10.x まで以下の書き方ができたが冗長なのでしなくて良くなった。 2022-07-26 追記
0.18.x 〜 0.19 までで再発している模様
code:ts
vi.mock('something', async () => ({
// @ts-ignore for mocking
...(await vi.importActual('something')),
}))
2022-08-08追記
以下で修正された