vi.mockするとVitestでserver-onlyモジュールをテストできる
#short
TODO server-onlyのモチベを書く
Vitestでserver-onlyなモジュールをテストしようとするとClient Components扱いされて死ぬ
server-onlyはimportされると即座にthrowするが、Server Componentsの実装(Next.jsとか)はサーバー向けバンドルではserver-onlyへのインポートを削除する処理を入れることでserver-onlyが成り立っている
Next.jsをVitestでテストしようとするとデフォルトではこのような設定はされていないので普通にテストすると正直にimportして死ぬ
Viteベースのフレームワークではそのような設定があらかじめあってもいいかもしれないですね
vi.mock() でserver-onlyを無のimportに書き換えるとよい
https://vitest.dev/api/vi.html#vi-mock
https://github.com/vercel/next.js/issues/60038#issuecomment-1876273967
in-source testingでのmockはVitest v3 (currently in beta)でないと動かない?説がある
https://github.com/vitest-dev/vitest/issues/6829
code:ts
import "server-only";
// なんやかんや
export async function serverOnlyFunction() {}
if (import.meta.vitest) {
const { test, vi } = import.meta.vitest;
vi.mock("server-only", async () => {
return {};
});
test("hey", () => {
// serverOnlyFunction() のテストをここでやる
});
}