使用Jest测试AngularJS指令时uuid未定义报错的解决方法
解决Jest测试AngularJS指令时uuid未定义的问题
下面是几个实测有效的解决方案,按需选择:
方案1:手动给全局对象挂载mock的uuid
指令的compile阶段可能跑在Angular的专属上下文里,普通全局挂载没生效的话,直接在测试文件顶部写:
global.uuid = { v4: jest.fn(() => 'test-uuid-123') };
这样指令调用uuid.v4()时会拿到这个模拟函数,既解决未定义报错,还能固定测试用的ID,后续断言也方便。
方案2:用Angular的$provide注入mock服务
如果能把指令里的uuid.v4()改成依赖注入的Angular服务(比如封装成uuidService),测试时直接在模块配置里替换这个服务:
beforeEach(module('你的指令所属模块', ($provide) => { $provide.value('uuidService', { v4: jest.fn(() => 'test-uuid-123') }); }));
这种方式更符合Angular的依赖注入规范,测试隔离性更好。
方案3:通过Jest全局setup文件统一处理
要是多个测试文件都碰到这个问题,不用挨个改,在项目根目录建个jest.setup.js:
// jest.setup.js global.uuid = { v4: jest.fn(() => 'fixed-test-uuid') }; // 要是需要真实的uuid生成,也可以直接引入: // const uuid = require('uuid'); // global.uuid = uuid;
然后在jest.config.js里配置:
module.exports = { setupFilesAfterEnv: ['./jest.setup.js'], // 其他原有配置... };
这样所有测试文件运行前都会自动挂载全局uuid。
方案4:修正jest.mock的写法
如果指令里是通过import或require引入uuid的,之前的mock写法可能不对,试试这个:
// 测试文件顶部 jest.mock('uuid', () => ({ v4: jest.fn(() => 'mock-uuid') })); // 要是指令里是解构引入的:import { v4 } from 'uuid',mock写法不变,因为jest会匹配导出结构
之后还能在测试里验证调用情况:
const uuid = require('uuid'); expect(uuid.v4).toHaveBeenCalled();
内容的提问来源于stack exchange,提问作者Etienne-qwer
相关产品推荐
相关产品推荐

