将笑话模拟包装在一个函数中以用于多个测试

Wrap jest mocks in a function for use in multiple tests

我正在尝试将 jest.mock 包装到一个函数中,以便我可以在多个文件中重复使用它。我的用例是反应挂钩,我正在使用打字稿。目前我的测试文件看起来像这样:

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
});

这很好用,但是这个 whatever 钩子被其他组件使用了,我正试图结束 jest.mock 以便在其他测试中重用。我正在尝试做的事情看起来像这样:

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
});

这样做时,运行 测试时出现类似“TypeError: utils_1.mocked(...).mockClear 不是函数”的错误。是否可以像这样包装模拟?如果是这样,我可能做错了什么或遗漏了什么?

谢谢

jest.mockhoisted 上面的 Babel 转换导入,这就是它按预期工作的原因:

import ... from 'whatever';
jest.mock('whatever', ...);

如果没有自定义 Babel 转换,mockWhatever 不可能实现同样的事情,因此模块在被模拟之前被导入。 import 需要替换为 require 并且为了使模拟生效,import..require syntax 可用于 TypeScript 类型安全。

__mocks__ 是一种重用 Jest 提供的模块模拟​​的方法。考虑到有 __mocks__/whatever.js 模拟模块,它被用作 jest.mock('whatever').

的模拟