茉莉花和Angular:模拟测试中的类的嵌套方法

时间:2019-11-26 12:28:02

标签: angular unit-testing jasmine

受尊敬的社区...

我正面临以下问题,听起来很简单,但找不到解决方案...

我正在测试Angular中的Controller-Class。这是具有大量依赖关系的遗留代码,我只想编写一个 不模拟所有依赖关系的单元测试

我正在寻找一种解决方案,模拟嵌套函数,即我调用一个方法,并期望嵌套方法被成功调用,没有实际调用它。< / p>

样本...

my-controller.ts

export class MyController {

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

   private initializeMyObject(): void {
     /*  doOtherStuff  */
   }
}

my-controller.spec.ts

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();
  });

});

我知道我们通常不模拟要测试的Class的方法,但是我从Java之类的其他编程语言中知道它可以工作,而且我很好奇如何做到这一点(除了事实之外,嵌套的依存关系将是总开销...)。

我已经阅读了有关jasmine.createSpyObj的内容,但我怀疑解决方案是否会类似于jasmine.createSpyObj('this', ['initializeMyObject']),如果我错了,请纠正我。

(这不是我要寻找的答案的一部分,但是,如果存在某些第三方库,我将很高兴提出建议并采取后续行动。)

我们将不胜感激。 干杯。

1 个答案:

答案 0 :(得分:0)

有多种方法可以用Jasmine模拟单个类的方法。这里有一些例子。

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

spyOn(object, 'method-name').and.callFake(() => null); 

方法应返回给定值时。

spyOn(object, 'method-name').and.returnValue(value); 

该方法接受参数并应返回基于它们的计算值。

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