NX Monorepo中Jest正确Mock Firebase-Admin的问题排查
NX Monorepo 中 Jest Mock Firebase-Auth 失败的排查与解决方案
常见问题排查
1. 模块路径映射配置错误
检查moduleNameMapper的正则表达式是否精准匹配firebase/auth的导入路径。正确配置需用^和$限制匹配范围,避免误匹配子路径,同时确认路径指向的Mock文件位置正确:
// 根级或库级 jest.config.ts module.exports = { moduleNameMapper: { '^firebase/auth$': '<rootDir>/libs/your-lib/src/__mocks__/firebase-auth.ts' } };
注意NX中<rootDir>默认指向项目根目录,需根据你的Mock文件实际位置调整路径。
2. Mock 文件结构与原模块不匹配
TypeError: Cannot read properties of undefined (reading 'createUser')大多因Mock导出结构和firebase-auth不一致,导致业务代码中获取的auth对象为undefined或缺少目标方法。
假设业务代码调用逻辑如下:
import { getAuth } from 'firebase/auth'; const auth = getAuth(); await auth.createUser(/* 参数 */);
对应的Mock文件firebase-auth.ts需严格匹配原模块的导出结构:
// libs/your-lib/src/__mocks__/firebase-auth.ts export const getAuth = jest.fn(() => ({ createUser: jest.fn().mockResolvedValue({ uid: 'mock-user-123' }) })); // 若用到其他API,同步添加Mock export const createUserWithEmailAndPassword = jest.fn().mockResolvedValue({ user: { uid: 'mock-user-123' } });
3. NX 配置层级冲突
NX的Jest配置分为根级和库级,若仅在根配置中添加moduleNameMapper,但库级配置未继承根配置,会导致Mock不生效。解决方式是在库的jest.config.ts中添加继承:
module.exports = { extends: '../../jest.config.ts', // 路径根据库的位置调整 // 其他库专属配置 };
实现全局统一 Mock(无需重复配置)
若希望所有库的测试共用同一个firebase-auth Mock,无需每个库单独配置,可按以下步骤操作:
- 在项目根目录创建
__mocks__/firebase-auth.ts,写入通用Mock逻辑; - 在根级
jest.config.ts中配置全局映射:module.exports = { moduleNameMapper: { '^firebase/auth$': '<rootDir>/__mocks__/firebase-auth.ts' }, // 其他全局Jest配置 }; - 所有库的
jest.config.ts继承根配置,即可自动应用全局Mock。
测试验证示例
在测试文件中断言Mock方法的调用情况,确认Mock生效:
import { getAuth } from 'firebase/auth'; import { registerUser } from '../src/register-user'; // 你的业务函数 describe('registerUser', () => { it('调用createUser创建用户', async () => { await registerUser('test@example.com', '123456'); const authInstance = getAuth(); expect(authInstance.createUser).toHaveBeenCalledWith('test@example.com', '123456'); }); });
内容的提问来源于stack exchange,提问作者Crocsx
相关产品推荐
相关产品推荐

