vi.mockするとVitestで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に書き換えるとよい
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() のテストをここでやる
});
}