Модульное тестирование для обслуживания в Angular

#angular #unit-testing #jasmine #karma-jasmine

#angular #модульное тестирование #jasmine #карма-жасмин

Вопрос:

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

Затем я вызываю метод beforeach.

  providers: [
    { provide: dataservice}    
  ],
  

Я получаю эту ошибку

 TypeError: Cannot read property 'setNumber' of undefined

this.dataService.setNumber(null);
  

В соответствии с приведенным ниже пользователем, которого я добавил

 const spyDataService = jasmine.createSpyObj('DataService', ['setNumber '])
  

перед каждым

Как избавиться от этой ошибки, я пытаюсь, как показано ниже, я получаю ошибку, и я изменил это на

   it('should be create data service', () => {    
     expect(DataService).setNumber;
    });

  it('should be create data service', () => {
    expect(service.setBCNumber).toHaveBeenCalledWith(null);
  }); 
  

но все равно я получаю ту же ошибку.

Ответ №1:

Вы должны предоставить класс вместо экземпляра. если вы хотите предоставить экземпляр, вы должны использовать useValue вот так:

 {
  provide: DataService,
  useValue: dataServiceMock
}
  

Кроме того, ожидание относится к экземпляру, а не к классу, следовательно

 expect(DataService).setNumber;
  

должно быть

 expect(dataService.setNumber).toHaveBeenCalledWith(null);
  

Вам также необходимо установить dataServiceMock в макет экземпляра, как в примере:

 let dataServiceMock: jasmine.SpyObj<DataService>;

beforeEach(() => {
  const spyDataService = jasmine.createSpyObj('DataService', ['setNumber ']);

...
    {
      provide: DataService,
      useValue: spyDataService
    }
...
  

Я рекомендую вам официальный сайт angular для тестирования:
https://angular.io/guide/testing-services

Комментарии:

1. Привет @JFPicard Я назначил DataService после описания, подобного этому let service: DataService, и я вызываю это в методе, который является expect (service). setnumber но я получил некоторую ошибку свойство setnumber не существует для маршеров типа<DataService>

2. Отредактировал мой ответ

3. Спасибо за ответ, но я все равно получаю ту же ошибку, это то, что я даю в providers[{provide:DataService, useValue:{} }], и это ожидаемый код (service.setNumber). toHaveBeenCalledWith(null)

4. Это ошибка, которую я получаю.DataService.setNumber не является функцией

5. Вы предоставляете пустую реализацию с useValue:{ } Вы должны добавить реальную реализацию с функцией setNumber