reactjs - Pakk jest-mock i en funksjon for bruk i flere tester
Jeg prøver å pakke en jest.mock inn i en funksjon slik at jeg kan gjenbruke den i flere filer. Bruksområdet mitt er for React-hooks, og jeg bruker TypeScript. For øyeblikket ser testfilene mine omtrent slik ut:
test.tsx
//some imports
jest.mock('../path/to/hoook/whatever', () => ({
useWhatever: jest.fn()
}))
const mockResult = () => {
return ({
some stuff
};
};
describe('Component', () => {
let wrapper;
beforeEach(() => {
mocked(useWhatever).mockClear();
mocked(useWhatever).mockImplementation(() => mockResult);
wrapper = shallow(
<Component />
);
});
//tests below
});
Dette fungerer helt fint, men denne hva-som-helst-hooken brukes av andre komponenter, og jeg prøver å pakke inn jest.mock for gjenbruk i andre tester. Det jeg prøver å gjøre ser omtrent slik ut:
mocks.ts
export const mockWhatever = () => jest.mock('../path/to/hoook/whatever', () => ({
useWhatever: jest.fn()
}))
export const mockResult = () => {
return ({
some stuff
};
};
test.tsx
//some imports
mockWhatever();
describe('Component', () => {
let wrapper;
beforeEach(() => {
mocked(useWhatever).mockClear();
mocked(useWhatever).mockImplementation(() => mockResult);
wrapper = shallow(
<Component />
);
});
//tests below
});
Når jeg gjør det på denne måten, får jeg feil som "TypeError: utils_1.mocked(...).mockClear er ikke en funksjon" når jeg kjører testen. Er det mulig å pakke inn mocks på denne måten? Og hvis det er mulig, hva kan jeg gjøre galt eller mangle?
Takk
Svar #1
jest.mock blir hevet over imports med Babel-transformasjon, dette er grunnen til at dette fungerer som forventet:
import ... from 'whatever';
jest.mock('whatever', ...);
Det er umulig å oppnå det samme for mockWhatever uten tilpasset Babel-transform, derfor importeres moduler før de blir mocket. import må erstattes med require, og for at en mock skal tre i kraft, kan import..require-syntaks brukes for TypeScript-type sikkerhet.
__mocks__ er en måte å gjenbruke modul-mocks som Jest tilbyr. Med tanke på at det finnes __mocks__/whatever.js som er en mocket modul, brukes den som en mock med jest.mock('whatever').
