Карма Жасмин - использовать сервисный метод из компонента - PullRequest
0 голосов
/ 24 апреля 2019

В моем компоненте есть следующий код:

ngOnInit() {
    this.formattedPacks = this.protocolPackService.formatPacks(this.selectedPacks);
}

В моем тесте я получаю следующую ошибку:

this.protocolPackService.formatPacks is not a function

Метод formatPacks - это вспомогательная функция без какого-либо запроса к серверу, который возвращает массив. Я не хочу, чтобы он вел себя как любой другой сервисный метод, который я должен шпионить и высмеивать с результатом.

Я тоже могу издеваться над formatPacks, но я использую его в двух разных тестах, и он должен выдавать разные результаты для каждого.

Как я могу убедиться, что оно выполнено правильно в моем тесте?

Я тестирую другие protocolPackService методы (вызовы API) в моем тесте следующим образом:

const ppackService = jasmine.createSpyObj('ProtocolPackService', ['listPacks', 'findPackDevices']);

    const packListResult = '{}';
    const packDevicesResult = '{}';

    const getPackListSpy = ppackService.listPacks.and.returnValue( Promise.resolve(packListResult) );
    const findPackDevicesSpy = ppackService.findPackDevices.and.returnValue( of(packDevicesResult) );

у моих провайдеров:

providers: [
            { provide: ProtocolPackService, useValue: ppackService },
            ToastService]

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

Поскольку вы создаете заглушку для ProtocolPackService, которая равна ppackService, тест ожидает, что formatPacks будет присутствовать в ppackService. То есть вы явно его создали. Если вы предоставляете услугу в модуле, она будет использоваться во всех компонентах, импортированных в этот модуль.

0 голосов
/ 03 июня 2019

Хорошо, проблема вашего подхода в том, что вам нужно использовать useClass и создать заглушку:


class PpackServiceStub{
    formatPacks(){
      // return whatever you are expecting, be it promise or Observable using of()
    }
    // create other methods similary with expected Output
  }

и в providers

providers: [
  { provide: ProtocolPackService, useClass: PpackServiceStub },
    ToastService
   ]

Теперь предположим, что вы хотите проверить 2 различных режима обслуживания, затем вам нужно создать spy. Я возьму пример функции checkIfHuman(), поэтому добавлю:


class PpackServiceStub{
    formatPacks(){
      // return whatever you are expecting, be it promise or Observable using of()
    }
    checkIfHuman(){
      return of({val : true})
    }
  }

с кодом component.ts как что-то вроде:

ngOnInit() {    
  this.protocolPackService.checkIfHuman().subscribe(res =>  
   { 
    this.humanFlag =  res.val
   })
}

сделать protocolPackService как public в component конструкторе, чтобы мы могли шпионить в spec файле, как показано ниже:

  it('On ngOnInit should assign value as TRUE', () => {
    spyOn(component.protocolPackService, 'checkIfHuman').and.returnValue(of({val: true}));
    // you dont even need to create this spy because you already have the same value being returned in "PpackServiceStub" 
    component.ngOnInit();
    expect(component.humanFlag).toBeTruthy();    
  });

  it('On ngOnInit should assign value as FALSE', () => {
    spyOn(component.protocolPackService, 'checkIfHuman').and.returnValue(of({val: false}));
    component.ngOnInit();
    expect(component.humanFlag).toBeFalsy();    
  });

0 голосов
/ 24 апреля 2019

Согласно упомянутым деталям, если вам нужно использовать оригинальный метод для formatPacks, вам нужно создать отдельный экземпляр для этой зависимости, а затем использовать его в своем тесте.

Попробуйте это для своеготесты

beforeEach(
  "...",
  inject([ProtocolPackService], protoPackService => {
    ppackService = jasmine.createSpyObj("ProtocolPackService", {
      listPacks: () => {},
      findPackDevices: () => {},
      formatPacks: packs => {
        protoPackService.formatPacks(packs);
      },
    });
  }),
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...