Vitestでグローバル変数をモックする方法
Vitestでグローバル変数をモックして差し替える方法の紹介です。
グローバル変数の変更
vi.stubGlobalを使うことで、テスト実行時のグローバル変数を変更できます。
import { vi } from 'vitest'
const DataviewAPI = new MockDataviewApi(); // モックとして使いたい変数vi.stubGlobal("DataviewAPI", DataviewAPI);vi.stubGlobal(変数名, 変更後)のように書くだけです。
ちなみにVitestの設定でglobalsを有効にしている場合、viのimportは必要ありません。
グローバル変数の取り消し
vi.stubGlobalによる変更を取り消すには、vi.unstubAllGlobalsを実行します。
vi.unstubAllGlobals()new Functionでも使える
筆者が実際にグローバル変数をモックしたかったのは次のようなnew Function(関数コンストラクタ)の中でした。
async function foo(source: string) { const func = new Function( `return new Promise((s,r)=>{(async ()=>{ const dv = DataviewAPI; return ${source}; })().then(s).catch(r)})`, ); return await func();}この第1引数内に渡す文字列のDataviewAPIをテストのときだけモックする必要がありました。
このnew Function内のグローバル変数も、もちろんvi.stubGlobalによるモックは有効です。
jsdomなどで使うほか、ブラウザ拡張機能やObsidianのプラグインの開発などでよく使いそうです。