jest.doMock 和 JSON 导入模拟
jest.doMock and JSON import mocking
我有这样的代码要测试:
...
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 导入,我想测试一下。我做错了什么以及如何使这个导入被嘲笑 'conditionally'?因为如果我在文件顶部模拟它(附近的导入) - 它会起作用,但对于所有测试用例都是相同的,而我需要在不同的测试用例中使这些数据不同。
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');
我有这样的代码要测试:
...
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 导入,我想测试一下。我做错了什么以及如何使这个导入被嘲笑 'conditionally'?因为如果我在文件顶部模拟它(附近的导入) - 它会起作用,但对于所有测试用例都是相同的,而我需要在不同的测试用例中使这些数据不同。
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');