使用jasmine.createSpyObj测试具有依赖关系的Angular服务

时间:2022-07-25
本文章向大家介绍使用jasmine.createSpyObj测试具有依赖关系的Angular服务,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

具有依赖关系的Service源代码:

import { Injectable } from '@angular/core';

@Injectable()
export class MasterService {
  constructor(private valueService: ValueService) { }
  getValue() { return this.valueService.getValue(); }
}

export class ValueService {
  getValue() { return 'Jerry'; }
}

单元测试代码:

describe('MasterService with Angular jasmine.createSpyObj', () => {
    let masterService: MasterService;
    let valueServiceSpy: jasmine.SpyObj<ValueService>;

    beforeEach(() => {
        const spy = jasmine.createSpyObj('ValueService', ['getValue']);

        TestBed.configureTestingModule({
    // Provide both the service-to-test and its (spy) dependency
        providers: [ MasterService, { provide: ValueService, useValue: spy }]
    });

    // Inject both the service-to-test and its (spy) dependency
        masterService = TestBed.inject(MasterService);
        valueServiceSpy = TestBed.inject(ValueService) as jasmine.SpyObj<ValueService>;
    });

    it('#getValue should return stubbed value from a spy', () => {
        const stubValue = 'stub value';
        valueServiceSpy.getValue.and.returnValue(stubValue);
        expect(masterService.getValue())
          .toBe(stubValue, 'service returned stub value');
        expect(valueServiceSpy.getValue.calls.count())
          .toBe(1, 'spy method was called once');
        expect(valueServiceSpy.getValue.calls.mostRecent().returnValue)
          .toBe(stubValue);
      });
});

测试结果: