#angular #jasmine #karma-jasmine
Вопрос:
Я новичок в модульном тестировании на angular 8. Я хочу протестировать наблюдаемую функцию, которая возвращает ответ http.patch внутри класса служб :
updateStatus(id: string, status: string): Observable<any> {
if (id === undefined || id === null || status === undefined || status === null) {
throw new Error('Cannot validate');
}
if (environment.role !== 'manager') {
return this.http.patch<string>(`${environment.ApiUrl}${id}/${status}`, {});
} else {
return this.http.patch<string>(`${environment.ApiUrl}${id}/${status}`, this.httpOptions);
}
}
и функция, которая вызывает наблюдаемое, является :
update(pt: IPointView, status: string) {
this.isLoading = true;
this.pointsService.updateStatus(pt.id.toString(), status).subscribe(
value => {
this.context.info(pt.id, `Update the status to ${status}`, pt);
this.isLoading = false;
if (pt.ptType === this.ptTypeRode ) {
this.open(pt);
}
},
error => {
this.context.error(pt.id, `Error to update the status to ${status}`, pt);
this.isLoading = false;
}
);
}
Как я могу протестировать этот метод обновления ? Я хочу закрыть код отверстия внутри этой функции.
Ответ №1:
Мой совет состоял бы в том, чтобы поиздеваться над сервисом, чтобы перед вызовом «обновления» вы могли сделать что-то вроде :
spyOn(yourService, 'updateStatus').and.returnValue(of("yourString"));
Таким образом, вы действительно контролируете, что может быть возвращено сервером в интересах вашего теста.
(Эта строка должна быть в самом тесте, до фактического вызова вашего статуса «обновить»… Никогда в производственном коде)
Комментарии:
1. но я хочу описать код внутри подписки как для значений, так и для ошибок
2. Если вы хотите протестировать два варианта поведения (когда все в порядке и когда есть ошибка), вам следует создать два теста. В первом (успешно) вы можете использовать строку конфигурации, которую я написал выше, а во втором (ошибка) вы можете использовать эту строку для имитации ошибки:
spyOn(yourService, 'updateStatus').and.throwError("thisIsAnError");