next.js 跨测试重用Jest模块模拟

olmpazwi  于 2023-01-25  发布在  Jest
关注(0)|答案(1)|浏览(172)

我想模拟一个测试模块。一切正常,但是我必须复制/粘贴相同的代码到每个测试文件中。我怎样才能使其更易于维护?

  • (这是在Next.js项目中使用Babel和TypeScript。)*

生产代码如下所示:

import { useRouter } from 'next/router';

// Then call the hook in a React component:
  const router = useRouter();

测试代码:

// I need to access these mocks in the tests
const mockRouterPush = jest.fn();
const mockRouterBack = jest.fn();

jest.mock('next/router', () => ({
  useRouter: () => ({
    push: mockRouterPush,
    query: { segment: 'seg1' },
    back: mockRouterBack,
  }),
}));

这样做很好。模块和它的钩子在测试文件中被模拟,我可以在测试中引用模拟。问题是很难跨多个测试文件进行维护。
对jest.mock()的调用被提升到文件的顶部,并且只能引用以单词'mock'开头的变量。
对于其他模拟,我在模块工厂中使用了require,而不是import;这样做可以减少样板文件,但是(a)使测试更难引用模拟文件;(b)我的IDE(VSCode)不能像在移动文件时自动更新导入文件那样自动更新所需路径。

jest.mock('react-i18next', () => {
  // Sometimes the path is '../../../testhelpers' etc.
  const { mockUseTranslation } = require('./testhelpers');

  return {
    useTranslation: mockUseTranslation,
  };
});

我尝试了doMockcreateMockFromModule,但没有成功。
其他人如何处理这个问题?

mqkwyuun

mqkwyuun1#

也许使用__mocks__目录可以帮助您。
来自文档:
手动模拟是通过在紧邻模块的mocks/子目录中编写模块来定义的。例如,要模拟models目录中名为user的模块,请创建名为user.js的文件,并将其放在models/mocks目录中。
您也可以从node_modules目录模拟模块。
Manual Mocks

相关问题