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').

Relaterte artikler