NestJS 测试模块:依赖替换的完整指南
来源:dev.to — 2026-09-18
📋 概述
一篇针对 NestJS 单元测试的实战文章,从一个常见怪象切入:测试里已经用 useValue 替换了服务,被测组件也确实拿到的是替身,但 moduleRef.get() 依然抛异常。作者指出关键在于理解测试模块本身是一个真实的依赖注入容器,而不是替身登记表。文章分阶段讲清 overrideProvider 的三种写法、useMocker 自动替身、get() 与 resolve() 在作用域提供者上的差别,以及如何在端到端测试里替换守卫、管道、拦截器与异常过滤器。
🔑 核心要点
- 测试模块是一个真实的 DI 容器,不是替身清单,能否取到实例取决于容器怎么解析依赖图。
- 手工 new 出服务实例或用 jest.mock 打补丁,都在与 Nest 的实例化逻辑对抗,一旦构造签名变化就成片失效。
- overrideProvider 支持 useValue、useClass、useFactory 三种替换方式,替身自身有依赖时必须用 useFactory。
- 同一个提供者,get() 与 resolve() 的差别决定了会不会抛异常,涉及请求级或瞬态作用域时只能用 resolve()。
- 守卫、管道、拦截器、过滤器同样可以替换,端到端测试不必真的登录或真的走一遍校验。
- useMocker 能自动补齐图里其余依赖,省掉大量样板代码,但它会掩盖真实的装配错误,该手写的地方仍要手写。
💡 金句
如果不知道 get() 和 resolve() 各自伸手去够的是什么,那个修复看起来就只是迷信——「换成 resolve() 就好了」,却不知道为什么。
👍 0
👎 0
← 返回 dev.to 首页