我正在 Nextjs 中开发一个应用程序。我有一个创建新产品的服务器操作,并且我试图在创建后在服务器操作内重新验证缓存。 它在开发中有效,但在我的测试中不起作用,为什么?
这是我的玩笑测试中的错误:
Invariant: static generation store missing in revalidateTag
我的服务器操作:
'use server';
export const createProduct = async (data: Product) => {
const product = await prisma.product.create({ data });
revalidateTag('product');
return product;
};
我调用服务器操作的测试:
describe('createProduct', () => {
it('should return a product', async () => {
const product = await createProduct({
name: 'myProduct',
// ...
});
expect(product).toHaveProperty('id');
});
});
在生产或开发中,Next.js 维护一个存储来跟踪需要重新验证的页面。此错误消息表明应该跟踪要重新验证的标签/页面的商店在测试环境中不可用。 Jest 测试不会启动完整的 Next.js 服务器环境,因此缺少跟踪重新验证所需的存储。
您可以在测试中模拟
revalidateTag
。这将绕过实际的 ISR 进程,并允许您测试 revalidateTag
是否按预期调用,而不会触发错误。
jest.mock('path-to-revalidateTag', () => ({
revalidateTag: jest.fn(() => Promise.resolve()),
}));
describe('createProduct', () => {
it('should return a product', async () => {
const product = await createProduct({
name: 'myProduct',
// ...
});
expect(product).toHaveProperty('id');
expect(revalidateTag).toHaveBeenCalledWith('product');
});
});