модульное тестирование наблюдаемых с createSpyObj - PullRequest
0 голосов
/ 20 декабря 2018

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

MyComponent

id = 1;

myFunct() {
  this.myService.delete(this.id);
}

MyService

delete(id) {
  this.http.delete(this.myUrl + '/' + id).subscribe()
}

Тест

let mockService;

beforeEach(() => {
  TestBed.configureTestingModule({
    mockService = createSpyObj(['delete']);

    imports: ...,
    declarations: ...,
    providers: [
      {provide: MyService, useValue: mockService}
    ]
  }).compileComponents();

  fixture = ...;
  component = ...;
  fixture.detectChanges();
});

it('should test delete', () => {
  mockService.delete.and.returnValue({ subscribe: () => {} });
  component.myFunct();
  expect(mockService.delete).toHaveBeenCalledTimes(1);
});

Мой тест возвращает ошибку:

Невозможно прочитать свойство'подписаться' на неопределенное

1 Ответ

0 голосов
/ 20 декабря 2018

Обычный шаблон - возвращать наблюдаемый из вашего метода обслуживания и подписываться внутри, например.составная часть.

Примерно так:

MyComponent

 id = 1;

 myFunct() { 
    this.myService.delete(this.id).subscribe( 
     (result) => console.log(result),
     (error) => console.log(error)
 };

MyService

 delete(id): Observable<any> {
   this.http.delete(this.myUrl + '/' + id)
 }

Тест

imports {of} from 'rxjs'

let mockService;

beforeEach(() => {
  TestBed.configureTestingModule({
    mockService = createSpyObj(['delete']);

    imports: ...,
    declarations: ...,
    providers: [
      {provide: MyService, useValue: mockService}
    ]
  }).compileComponents();

  fixture = ...;
  component = ...;
  fixture.detectChanges();
});

it('should test delete', () => {
  mockService.delete.and.returnValue(of({id: 1}));
  component.myFunct();
  expect(mockService.delete).toHaveBeenCalledTimes(1);
});
...