在 TestBed 中创建 angular 组件时,如何覆盖 jasmine 中 ngOnInit 中的函数?

How to override a function inside ngOnInit in jasmine when creating an angular component in TestBed?

我有一个 ngOnInit 函数在同一个组件中调用另一个函数,我正在使用 jasmine 测试测试这个组件。

我想模拟 ngOnInit 函数内部的函数,以防止执行原始实现。

  ngOnInit(): void {
    this.initializeData();
  }

我在每个函数之前尝试了以下实现,但这样 ngOninit 将执行两次:

  beforeEach(() => {
    testHostFixture = TestBed.createComponent(TestHostComponent);
    testHostComponent = testHostFixture.componentInstance;
    spyOn(testHostComponent, 'initializeData').and.callFake(()=>{console.log("replacement");});
    testHostComponent.ngOnInit();
    testHostFixture.detectChanges();
  });

有没有办法在 ngOnInit 第一次执行之前模拟函数 'initializeData' 的实现?

谢谢。

在创建组件之前您需要监视。所以只需将间谍移动到创建线上方即可。

  beforeEach(() => {
    spyOn(testHostComponent, 'initializeData').and.callFake(()=> 
    {console.log("replacement");});
    testHostFixture = TestBed.createComponent(TestHostComponent);
    testHostComponent = testHostFixture.componentInstance;

    testHostComponent.ngOnInit();
    testHostFixture.detectChanges();
  });

您的 ngOnInit()TestBed 中创建时,组件运行 ngOnInit() 时将在此处被调用两次。如果你只希望它被调用一次。删除显式调用 testHostComponent.ngOnInit();