如何多次模拟自定义外部Hook库?以jest模拟useReactiveVar为例
解决方法
要在不同测试用例里让useReactiveVar返回不同的bool值,你得把它改成可动态调整的jest模拟函数,而不是写死固定返回值。具体操作如下:
- 先修改全局mock的定义,把
useReactiveVar设为jest.fn()并给初始返回值:
jest.mock("@apollo/client", () => ({ ...jest.requireActual("@apollo/client"), // 定义成jest模拟函数,默认返回bool: false useReactiveVar: jest.fn(() => ({ ...data, bool: false })), }))
- 在测试文件顶部引入这个模拟的
useReactiveVar:
import { useReactiveVar } from "@apollo/client";
- 然后在各个测试用例里按需修改返回值:
test("测试用例1:bool为false", () => { // 可以用默认值,也可以显式设置 useReactiveVar.mockReturnValue({ ...data, bool: false }); // 这里写你的测试逻辑 }); test("测试用例2:bool为true", () => { // 覆盖返回值,让bool变成true useReactiveVar.mockReturnValue({ ...data, bool: true }); // 这里写你的测试逻辑 });
为啥之前的尝试没成功?
如果之前你单独定义了useReactiveVarMock但没生效,大概率是没把这个mock函数和@apollo/client模块里的useReactiveVar关联起来。上面的写法直接在jest.mock里把useReactiveVar定义成jest.fn(),再通过模块引入拿到这个函数,就能保证在测试用例里能正常修改它的返回值。
另外要注意,如果data是外部变量,得确保它在测试用例里能访问到,或者根据需求调整返回的对象结构。
内容的提问来源于stack exchange,提问作者Red Baron
相关产品推荐
相关产品推荐

