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

如何Mock NgxSummernoteDirective解决Angular测试循环问题

解决Angular测试中NgxSummernoteDirective初始化循环问题

方案一:完全Mock NgxSummernoteDirective

直接提供Mock指令替换原指令,跳过初始化逻辑,阻断循环触发:

// 定义Mock指令类
class MockNgxSummernoteDirective {
  @Input() ngxSummernoteDisabled = false;

  createEditor() {
    // 标记编辑器已初始化,阻断循环逻辑
    (this as any)._editorInitialized = true;
    // 模拟必要元素属性,避免后续逻辑报错
    (this as any)._$element = {};
  }
}

// 在测试模块配置中替换原指令
TestBed.configureTestingModule({
  declarations: [YourTargetComponent],
  providers: [
    { provide: NgxSummernoteDirective, useClass: MockNgxSummernoteDirective }
  ]
});

方案二:Mock jQuery与summernote方法

原问题核心是$(this.el.nativeElement)报错或返回空,因此Mock全局jQuery,返回符合预期的链式调用对象:

// 声明全局jQuery变量
declare var $: any;

beforeEach(() => {
  // Mock jQuery,返回包含summernote链式调用的模拟对象
  spyOn(window, '$').and.returnValue({
    summernote: jasmine.createSpy('summernote').and.returnValue({
      data: jasmine.createSpy('data').and.returnValue({ $note: {} })
    })
  });

  TestBed.configureTestingModule({
    declarations: [YourTargetComponent],
    imports: [NgxSummernoteModule]
  });
});

方案三:Override原指令的createEditor方法

若需保留NgxSummernoteModule导入,可直接覆盖指令的目标方法:

beforeEach(() => {
  TestBed.configureTestingModule({
    declarations: [YourTargetComponent],
    imports: [NgxSummernoteModule]
  })
  .overrideDirective(NgxSummernoteDirective, {
    set: {
      createEditor() {
        // 直接标记初始化完成,跳过原循环逻辑
        (this as any)._editorInitialized = true;
        (this as any)._$element = {};
      }
    }
  });
});

方案选择建议

  • 若只需测试组件非编辑器逻辑,优先用方案一,完全隔离编辑器依赖;
  • 若需验证组件与编辑器的交互逻辑,用方案二,模拟底层依赖让初始化流程正常完成;
  • 若需保留模块结构但修改特定方法,用方案三。

内容的提问来源于stack exchange,提问作者saab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:50:01