ng-mocks中MockBuilder的mock()与provide()方法有何区别?
ng-mocks 中
mock() 和 provide() 方法的区别 这两种方法都是ng-mocks里替换Angular依赖的API,但核心定位和行为差异明显:
1. 核心逻辑与默认行为
mock()是ng-mocks专属语法糖:
它会基于目标服务类自动生成一个默认mock实例(所有方法默认返回undefined或对应类型空值)。如果传入第二个参数(如示例中的对象),该对象的属性/方法会覆盖默认mock的对应部分,未指定的方法则保留默认mock实现。
示例代码:MockBuilder(TargetService, TargetModule) .mock(Service2, { trigger: () => 'mock2' })假设
Service2还有getData方法,此时getData会保留默认mock行为(返回undefined)。provide()是Angular Provider的直接封装:
它完全遵循Angular依赖注入规则,你需要手动定义完整的Provider配置,ng-mocks不会生成任何默认mock。传入的useValue/useClass/useFactory等配置会直接作为依赖的提供来源。
示例代码:MockBuilder(TargetService, TargetModule) .provide({ provide: Service2, useValue: { trigger: () => 'mock2' }})同样假设
Service2有getData方法,此时这个自定义对象里没有getData,调用会直接抛出方法不存在的错误。
2. 对mock动态修改的支持
- 使用
mock()生成的依赖,属于ng-mocks的mock管理体系,后续可以通过MockInstanceAPI动态修改其行为:MockInstance(Service2, 'trigger', () => 'updated mock') - 使用
provide()提供的自定义依赖,和ng-mocks的mock系统无关,无法用MockInstance修改其行为,只能直接修改你传入的对象(如果是引用类型)来调整。
3. 适用场景
- 优先用
mock():当你需要快速生成mock、仅修改部分方法,或后续需要动态调整mock行为时,它更简洁高效。 - 选择
provide():当你需要完全自定义依赖的提供逻辑(比如用自定义类、工厂函数,或直接提供固定值,不需要ng-mocks的默认mock),它更灵活,完全兼容Angular的DI规则。
内容的提问来源于stack exchange,提问作者krema
相关产品推荐
相关产品推荐

