茉莉花;Angular:模拟被测试类的嵌套方法

茉莉花;Angular:模拟被测试类的嵌套方法,angular,unit-testing,jasmine,Angular,Unit Testing,Jasmine,荣誉社区 我面临以下问题,感觉很简单,但我找不到解决办法 我正在用Angular测试一个控制器类。它是具有大量依赖项的遗留代码,我只想编写一个单元测试,而不模拟所有依赖项 我正在寻找模拟嵌套函数的解决方案,即调用一个方法,并期望成功调用嵌套方法,而不实际调用它 一个样本 我的控制器。ts export class MyController { constructor () {} public init() { /* doStuff */ this.initi

荣誉社区

我面临以下问题,感觉很简单,但我找不到解决办法

我正在用Angular测试一个控制器类。它是具有大量依赖项的遗留代码,我只想编写一个单元测试,而不模拟所有依赖项

我正在寻找模拟嵌套函数的解决方案,即调用一个方法,并期望成功调用嵌套方法,而不实际调用它

一个样本

我的控制器。ts

export class MyController {

   constructor () {}
   public init() {
      /* doStuff */
      this.initializeMyObject();
   }

   private initializeMyObject(): void {
     /*  doOtherStuff  */
   }
}
describe('MyController', () => {
  let controller: MyController;

  configureTestSuite(() => {
    TestBed.configureTestingModule({
      schemas: [NO_ERRORS_SCHEMA],
      imports: [/*.. module imports ..*/],
      providers: [ MyController ],
    });
  });

  beforeEach(() => {
    controller = TestBed.get(MyController);
  });

  it('completion should be called', () => {
    // arrange
    spyOn(controller, 'initializeMyObject');

    // act
    controller.init();

    // assert
    expect(controller.initializeMyObject).toHaveBeenCalled();
  });

});
我的控制器规范ts

export class MyController {

   constructor () {}
   public init() {
      /* doStuff */
      this.initializeMyObject();
   }

   private initializeMyObject(): void {
     /*  doOtherStuff  */
   }
}
describe('MyController', () => {
  let controller: MyController;

  configureTestSuite(() => {
    TestBed.configureTestingModule({
      schemas: [NO_ERRORS_SCHEMA],
      imports: [/*.. module imports ..*/],
      providers: [ MyController ],
    });
  });

  beforeEach(() => {
    controller = TestBed.get(MyController);
  });

  it('completion should be called', () => {
    // arrange
    spyOn(controller, 'initializeMyObject');

    // act
    controller.init();

    // assert
    expect(controller.initializeMyObject).toHaveBeenCalled();
  });

});
我知道我们通常不会模拟正在测试的类的方法,但我从其他编程语言(如Java)中知道它是有效的,我只是好奇如何做到这一点(此外,模拟所有嵌套依赖项将是一个总开销…)

我读过一些关于jasmine.createSpyObj的文章,但我怀疑解决方案是否会像jasmine.createSpyObj('this',['initializeMyObject']),如果我错了,请纠正我

(这不是我要寻找的答案的一部分,但如果存在一些第三方LIB,我很乐意提出建议并跟进。)

我们将不胜感激。
干杯。

用Jasmine模拟单个类方法有不同的方法。这里有几个例子

当一个方法没有返回值(
void
返回类型)时

方法应返回给定值的时间

spyOn(object, 'method-name').and.returnValue(value); 
当方法接受参数并应返回基于它们的计算值时

spyOn(object, 'method-name').and.callFake((p1, p2) => {
    // compute value
    return value;
}); 

但是我如何测试该方法是否真的被调用?如何验证:
expect(object.method name).toHaveBeenCalled()
expect(object.method name).toHaveBeenCalled()
很好。您可以分享
MyController.initi
MyController.initializeMyObject
方法的全部内容吗?也许你在那里执行一些异步的工作。请你也考虑这个答案,因为你正在窥探一个私有的方法:我确实有一个异步时间函数,但是这个是被嘲笑的。在调用
initializeMyObject
之前,我收到一个console.log输出,所以它肯定会到达那里
spyOn
或MyController。prototype也未成功