Протестируйте HttpErrorResponse из службы с имитацией ts-mockito

У меня возникли проблемы со сценариями ошибок при тестировании спецификаций компонентов из моего класса обслуживания. Класс обслуживания имитируется с помощью ts-mockito.

Класс обслуживания:

export class MyService {
   getData(): Observable<any> {
      /* return httpClient.get(...) */
   }
}

Я упростил логику, которая не работает в моем тесте компонента, до этой простой репликации (в моем реальном тесте компонент вызывает службу, а не тестовый код, но это воспроизводит то, что я испытываю):

it('should return an error response', () => {
  const httpErrorResponse = new HttpErrorResponse({
    error: { msg: 'Not allowed' },
    status: 400,
    statusText: 'Forbidden',
  });
  const mockTestService = mock(MyService);
  when(mockTestService.getData()).thenReturn(of(httpErrorResponse));
  const mockInstance = instance(mockTestService);
  mockInstance.getData().subscribe(
    (success) => console.log('success'),   /* <= this is what I get */
    (err) => console.log('error')          /* <= this is what I want */
  );
});

Однако вывод здесь — «успех», а не «ошибка». Как настроить наблюдаемый ответ от макета, чтобы вызвать состояние ошибки в подписке?

Я также пробовал when(mockTestService.getData()).thenReject(httpErrorResponse), но это выдает необработанный отказ от обещания.


person Chris Knight    schedule 30.09.2020    source источник
comment
Обещания и наблюдаемые — это две разные вещи; обещание не имеет метода подписки. Чтобы создать observable, который выдает ошибку, см., например, rxjs.dev/api/index/function/throwError. Также ваша служба, вероятно, не должна выставлять HttpErrorResponse, потому что тогда детали транспортного уровня попадают в остальную часть вашего приложения.   -  person jonrsharpe    schedule 30.09.2020
comment
Спасибо @jonrsharpe, именно то, что я искал, и это решает мою проблему. Если вы ответите на свой комментарий, я буду рад проголосовать и принять его. И хороший крик о разоблачении HttpErrorResponse, пища для размышлений.   -  person Chris Knight    schedule 30.09.2020
comment
Вы должны увидеть возможность принять дубликат, чьи ответы охватывают throwError   -  person jonrsharpe    schedule 30.09.2020
comment
Понял, большое спасибо за помощь   -  person Chris Knight    schedule 30.09.2020