【发布时间】:2020-05-01 03:06:34
【问题描述】:
我正在尝试标准化定期模拟函数的模拟方式。
所以我有一个函数可以处理对useHomeScreenContext.ts 中的主屏幕上下文的调用。
export const useHomeScreenContext = () => useContext(/* context here */)
然后我正在测试的组件使用该钩子
Component.tsx
export const Component = () => {
const context = useHomeScreenContext();
}
然后我的组件测试文件看起来像
Component.test.tsx
const contextSpy = jest.spyOn(context, 'useHomeScreenContext');
it("works", () => {
contextSpy.mockReturnValue(fakeValue)
expect(fakeValue).toBeTruthy()
})
我使用这种方法遇到的问题是,将需要通过模拟此上下文来测试大量文件,而实际的模拟比我在这里提出的要复杂一些。所以我想做的是使用实用函数来标准化模拟,所以我创建了一个名为mockHomeScreenContext.ts 的单独文件,看起来有点像这样。
const contextSpy = jest.spyOn(context, 'useHomeScreenContext');
export const mockHomeScreenContext = (context) => {
beforeAll(() => {
contextSpy.mockReturnValue(mergeDeepLeft(context, homeScreenContextDefaults));
});
afterAll(() => {
contextSpy.mockRestore();
});
};
它的想法是在描述块内部使用它,它会像这样在描述块的末尾整理自己
describe('and does not have funds', () => {
mockHomeScreenContext(contextOverrides);
it("works", () => {
// Tests here
})
});
这似乎工作得很好,直到我有 2 个描述块,然后事情开始变得有点混乱,一些测试似乎正确地模拟了数据,但是随后所有的测试都将失败,因为模拟函数没有返回任何东西.摆脱 afterAll 调用以清理模拟会有所帮助,但它会感染其他测试。
几天来,我一直在兜圈子,试图让它发挥作用,我觉得这真的不应该这么困难,我只是对 jest mocks 的工作原理有点了解。
【问题讨论】:
标签: reactjs typescript jestjs