Модульное тестирование функции канала catcherror в службе angular

Я пытаюсь понять, как проверить эту функцию. От (err)=>{ line, это отображается как непокрытая выписка. service.ts

Deletevote(inp) {
   console.log(inp);
     
   return this.http.post(environment.apiUrl + '/api/reset/abc', inp).pipe(
      catchError((err) => {
         console.log('error caught in service');
         console.error(err);
         return throwError(err);
      })
   );
}

Я создал этот тестовый пример для положительного потока, но ошибочная часть все еще не покрыта. Пожалуйста, подскажите, как создать ошибку.

service.spec.ts

const Mockcolor = 'green';
const MockGen = 'male';

it('submitnominGreen', () => {
    service.Deletevote(DeleteObj).subscribe((posts) =>{
      expect(posts).toEqual([Mockcolor,MockGen], 'should check mock data');
    });
    const req =  httpTestCtrl.expectOne(environment.apiUrl + '/api/reset/abc');
    expect(req.request.method).toBe('POST');
    expect(req.cancelled).toBeFalsy();
    req.flush([Mockcolor,MockGen])
});

person Community    schedule 14.07.2021    source источник
comment
Вы читали https://angular.io/guide/http#testing-for-errors? ?   -  person jonrsharpe    schedule 14.07.2021
comment
Да, но как мне кодировать мою функцию?   -  person    schedule 15.07.2021
comment
В их коде нет карты каналов.   -  person    schedule 15.07.2021
comment
Вы не можете ожидать, что документация покроет все возможные виды потребляющего кода. Это показывает, как сделать ошибку в тесте, затем вы должны применить это к вашим конкретным обстоятельствам.   -  person jonrsharpe    schedule 15.07.2021
comment
Я новый участник, и мне нужна помощь в коде. Модульное тестирование не имеет большого количества справочного материала.   -  person    schedule 15.07.2021
comment
В нем множество справочных материалов, только в официальных документах есть то, на что я вам указал, а также весь этот раздел: angular.io/guide/testing.   -  person jonrsharpe    schedule 15.07.2021
comment
Выдача ошибок для моего кода для httpClient   -  person    schedule 15.07.2021
comment
Опять же, вы не можете ожидать, что документация или любой другой ресурс покажет ваш конкретный код. Ваша задача — применить общую информацию к вашему конкретному делу. Если вы не можете предоставить минимально воспроизводимый пример вашей попытки сделать это, вы также можете удалить этот вопрос. - это не служба написания кода.   -  person jonrsharpe    schedule 15.07.2021
comment
it('submitnominGreen', () => { service.Deletevote(DeleteObj).subscribe((posts) =>{ expect(posts).toEqual([Mockcolor,MockGen], 'should check mock data'); }); const req = httpTestCtrl.expectOne(environment.apiUrl + '/api/reset/abc'); expect(req.request.method).toBe('POST'); expect(req.cancelled).toBeFalsy(); req.flush([Mockcolor,MockGen]) }); Я пробовал это, но все же это не покрывает часть ошибки. Пожалуйста, направьте часть ошибок прямо сейчас   -  person    schedule 15.07.2021
comment
Пожалуйста, отредактируйте вопрос. Но на самом деле вы, похоже, не создаете состояние ошибки, поэтому неудивительно, что часть не охвачена - возможно, попробуйте фактически применить то, что предлагает документация.   -  person jonrsharpe    schedule 15.07.2021
comment
Сделал все, теперь, пожалуйста, помогите мне с кодом.   -  person    schedule 15.07.2021
comment
Нет, нет. У вас есть один тест, похоже, на счастливый путь. Конечно, другая ветвь не покрыта.   -  person jonrsharpe    schedule 15.07.2021
comment
Скопируйте код в свой проект angular или stackblitz и решите проблему, если очень хотите!   -  person    schedule 15.07.2021
comment
Хорошо, в последний раз я спрашиваю, какие основные требования вы хотите, чтобы я предоставил? P.S. Я не понимаю, как создать ошибку, поэтому я не могу дать тестовый пример ввода ошибки.   -  person    schedule 15.07.2021
comment
Добро пожаловать в сообщество SO, Шакти Рупини! вы проделали большую работу по уточнению вопроса. Вам и сообществу будет полезно завершить вводный тур stackoverflow.com/tour. Это поможет увеличить ваши шансы на получение помощи. И дал бы тебе бейдж (: Наверное, еще какие-то баллы, которые дали бы тебе больше разрешений здесь   -  person IAfanasov    schedule 17.07.2021


Ответы (1)


Во-первых, код внутри subscribe модульного теста не будет выполняться. Karma будет ждать завершения всего выполнения синхронизации и будет считать тест завершенным до того, как будет выполнен асинхронный обратный вызов. В качестве решения вы можете использовать обратный вызов done, чтобы указать, когда тест завершится вручную.

Вы отлично поработали, используя HttpTestingModule для тестирования. Это также позволяет легко проверять ошибки. Вместо req.flush вы можете использовать метод req.error для имитации ошибки HTTP.

it('submitnominGreen', (done) => {
    const mockError = {error: 'someError'} as ErrorEvent;
    service.Deletevote(DeleteObj).subscribe(() => {}, (thrownError) =>{
      expect(thrownError.error).toEqual(mockError);
      done();
    });
    const req =  httpTestCtrl.expectOne(environment.apiUrl + '/api/reset/abc');
    req.error(mockError);
});

Загляните в раздел Error handling этой замечательной статьи: Testing Angular HTTP Communication . Это было бы полезно и для некоторых других сценариев.

person IAfanasov    schedule 17.07.2021
comment
Я пробовал этот код, но в строке req.error он выдает эту ошибку Argument of type 'Error' is not assignable to parameter of type 'ErrorEvent'. Type 'Error' is missing the following properties from type 'ErrorEvent': colno, error, filename, lineno, and 22 more.ts(2345) - person ; 17.07.2021
comment
Я обновил код. Теперь это должно работать. - person IAfanasov; 17.07.2021
comment
Теперь это ошибка. Expected object to be a kind of Object, but was HttpErrorResponse({ headers: HttpHeaders({ normalizedNames: Map( ), lazyUpdate: null, headers: Map( ) }), status: 0, statusText: 'Unknown Error', url: 'http://localhost:3000/api/reset/abc', ok: false, name: 'HttpErrorResponse', message: 'Http failure response for http://localhost:3000/api/reset/abc: 0 ', error: Object({ error: 'someError' }) }). - person ; 17.07.2021
comment
это начинает выглядеть как разработка, управляемая Google (: @Sakthy Rupini, это всего лишь крошечный шаг к решению. пожалуйста, прочитайте сообщение об ошибке. - person IAfanasov; 18.07.2021
comment
Я думал, что мне нужно удалить как ErrorEvent, но это не сработало. - person ; 19.07.2021
comment
Привет, Сакти, я добавил правку в ответ, как только @IAfanasov примет ее, ты исправишь ее. А пока попробуйте консоль throwError, а также объект mockError. - person Kartik Dolas; 19.07.2021
comment
Привет @IAfanasov, у моего друга есть сомнения в модульном тестировании. Пожалуйста, решите это. stackoverflow.com/questions/68334529/ - person Kartik Dolas; 19.07.2021