跨测试重用 Jest 模块模拟
Reuse Jest module mocks across tests
我想模拟一个模块进行测试。一切正常,但我必须 copy/paste 将相同的代码添加到每个测试文件中。我怎样才能使它更易于维护?
(这是在 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) 不会像它那样自动更新 require 路径当我移动文件时使用导入。例如:
jest.mock('react-i18next', () => {
// Sometimes the path is '../../../testhelpers' etc.
const { mockUseTranslation } = require('./testhelpers');
return {
useTranslation: mockUseTranslation,
};
});
我试过 doMock
和 createMockFromModule
都没有成功。
其他人如何处理这个问题?
也许使用 __mock__
目录可以帮到你。
来自文档:
Manual mocks are defined by writing a module in a mocks/ subdirectory immediately adjacent to the module. For example, to mock a module called user in the models directory, create a file called user.js and put it in the models/mocks directory.
您还可以从 node_modules
目录模拟模块。
我想模拟一个模块进行测试。一切正常,但我必须 copy/paste 将相同的代码添加到每个测试文件中。我怎样才能使它更易于维护?
(这是在 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) 不会像它那样自动更新 require 路径当我移动文件时使用导入。例如:
jest.mock('react-i18next', () => {
// Sometimes the path is '../../../testhelpers' etc.
const { mockUseTranslation } = require('./testhelpers');
return {
useTranslation: mockUseTranslation,
};
});
我试过 doMock
和 createMockFromModule
都没有成功。
其他人如何处理这个问题?
也许使用 __mock__
目录可以帮到你。
来自文档:
Manual mocks are defined by writing a module in a mocks/ subdirectory immediately adjacent to the module. For example, to mock a module called user in the models directory, create a file called user.js and put it in the models/mocks directory.
您还可以从 node_modules
目录模拟模块。