将笑话模拟包装在一个函数中以用于多个测试
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.mock
是 hoisted 上面的 Babel 转换导入,这就是它按预期工作的原因:
import ... from 'whatever';
jest.mock('whatever', ...);
如果没有自定义 Babel 转换,mockWhatever
不可能实现同样的事情,因此模块在被模拟之前被导入。 import
需要替换为 require
并且为了使模拟生效,import..require
syntax 可用于 TypeScript 类型安全。
__mocks__
是一种重用 Jest 提供的模块模拟的方法。考虑到有 __mocks__/whatever.js
模拟模块,它被用作 jest.mock('whatever')
.
的模拟
我正在尝试将 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.mock
是 hoisted 上面的 Babel 转换导入,这就是它按预期工作的原因:
import ... from 'whatever';
jest.mock('whatever', ...);
如果没有自定义 Babel 转换,mockWhatever
不可能实现同样的事情,因此模块在被模拟之前被导入。 import
需要替换为 require
并且为了使模拟生效,import..require
syntax 可用于 TypeScript 类型安全。
__mocks__
是一种重用 Jest 提供的模块模拟的方法。考虑到有 __mocks__/whatever.js
模拟模块,它被用作 jest.mock('whatever')
.