Vitestでグローバル変数をモックする方法

· 2 min read

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