Как выполнить модульное тестирование observable, которое возвращает ответ http.patch?

#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");