为什么revalidateTag和revalidatePath在jest测试中不起作用?

问题描述 投票:0回答:1

我正在 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 caching jestjs
1个回答
0
投票

在生产或开发中,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');
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.