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のプラグインの開発などでよく使いそうです。