jest.doMock和JSON导入模拟

问题描述

我有这样的代码要测试:

...
import data from '../data/mock.json';

// function is async
export const something = async () => {
    try {
        ...
        if (!data) {
          throw 'error is here!';
        }

        return data;
    } catch (error) {
        return error;
    }
};

我的规格看起来是这样的:

...
import { something } from './handler';

describe('handler: something',() => {
    beforeEach(() => {
        jest.resetModules();
    });

    describe('on something',() => {
        it('should return data',async () => {
            const data = [
                {
                    id: 1,price: '1',},{
                    id: 2,price: '2',];

            jest.doMock('../data/mock.json',() => {
                return {
                    __esModule: true,default: data,};
            });
            await import('../data/mock.json');

            await expect(something()).resolves.toEqual(data);
        });

        it('should return error',async () => {
            jest.doMock('../data/mock.json',() => ({
                __esModule: true,default: undefined,}));

            await import('../data/mock.json');

            await expect(something()).resolves.toBe('error is here');
        });
    });
});

不知道为什么:但是我想测试的代码中并没有模拟json导入。我做错了什么以及如何使此导入“有条件地”被嘲笑?因为如果我在文件的顶部(附近导入)对它进行模拟-它将起作用,但对于所有测试用例都是相同的,而我需要在不同的测试用例中使这些数据不同。

解决方法

jest.doMock不会影响something,因为它已经使用原始的mock.json并且需要重新导入,而在测试中重新导入mock.json不会单独影响任何东西。

应该是:

    jest.doMock('../data/mock.json',() => ({
        __esModule: true,default: undefined,}));

    const { something } = await import('./handler');

    await expect(something()).resolves.toBe('error is here');

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...