はじめに
next.jsでアプリを作っていて、vitestでテストを書いていたところエラーが発生しました。
問題
ReferenceError: Cannot access 'error' before initialization
【エラーが発生したコード】
let error = null;
vi.mock("@/hooks/useAuth", async () => {
const actual = await vi.importActual("@/hooks/useAuth");
return {
...actual,
signInWithPassword: vi.fn().mockResolvedValue({
error: error,
}),
};
});
解決方法
vi.mock("@/hooks/useAuth", async () => {
const actual = await vi.importActual("@/hooks/useAuth");
return {
...actual,
signInWithPassword: vi.fn().mockResolvedValue({
error: null,
}),
};
});
変数を挟まずに直接errorにnullを指定しました。
ホイスティングと言って、Vitestが vi.mock() の呼び出しをファイルの先頭に自動的に巻き上げるため、let error = null の宣言より前に実行されるのが原因です。
おわりに
テストによってsupabaseが返却してくるerrorを変更したかったのですが、別の方法を考えてみます。