正解は「ReferenceError になる」です。vi.mock の呼び出しはファイル先頭に巻き上げ(ホイスティング)されるため、ファイル上での記述順に関係なく、import 文よりもさらに前に実行されます。その結果、ファクトリ関数の中で参照している mockName はまだ初期化されておらず、TDZ(Temporal Dead Zone)に引っかかってエラーになります。「import の後に書いたから無視される」も「undefined になる」も誤りで、Vitest はファクトリの中で外部スコープの変数を参照したことを検知して明示的にエラーを投げます。なぜ vi.mock はホイスティングされるのかテスト対象ファイルを import した時点で、その依存モジュールはすでに評価されてしまいます。後から「やっぱりモックに差し替えたい」と言っても遅いのです。そこで Vitest は Jest と同じ思想で、vi.mock の呼び出しをトランスフォーム時にファイル先頭へ移動させ、import より先にモック登録を完了させます。これが「import 文の下に vi.mock を書いても効く」理由であり、同時に「外部変数を使えない」制約の根本原因でもあります。外部変数を使いたいときの正解パターンVitest 0.31 以降では vi.hoisted が用意されており、これも一緒にホイスティングされるため安全に値を共有できます。const { mockName } = vi.hoisted(() => { return { mockName: 'Alice' } }) vi.mock('./user', () => ({ getUser: () => ({ name: mockName }) }))慣習として、ファクトリ内で参照する変数を mock プレフィックスで命名する流儀もあります。Jest 時代の名残ですが、Vitest でも「これはホイスティング前提の値だ」と読み手に伝わるので有用です。よくある勘違い「import の順番を変えれば動く」と考えがちですが、ホイスティングされるので順序は無関係ですファクトリの外側で外部変数を使うのは問題ありません。NG なのはファクトリ関数の中身から外を参照することです動的 import や vi.doMock を使えばホイスティングされないため、テストケースごとに挙動を変えたいときの選択肢になります