You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:35:23