Ошибка модульного теста — ожидаемый объект ({сообщение: ‘сообщение об ошибке’ }) равен ‘сообщение об ошибке’

#angular #unit-testing #karma-jasmine

#angular #модульное тестирование #карма-жасмин

Вопрос:

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

введите описание изображения здесь

Я не уверен, что это значит — как «сообщение об ошибке» не равно «сообщению об ошибке» здесь?

 it('should return error when unable to update Reconciliation Flag', (done) => {
    const id = '26949';
    const subPostingId = '0';
    const isReconciled = 'false';
    const errorResponse = { error: { message: 'error message' } };
    spyBmlService.get
        .withArgs(BmlRequest.SetReconciled, {
            bwtxnid: id,
            bwpostingid: subPostingId,
            isreconciled: isReconciled,
        })
        .and.returnValue(of(errorResponse));

    service.setReconciliationFlag(id, subPostingId, isReconciled).subscribe(
        () => {},
        (error: any) => {
            expect(error.message).toEqual('error message');
            done();
        }
    );
});
 

setReconciliationFlag код:

 public setReconciliationFlag(
    id: string,
    subPostingId: string,
    isReconciled: string
): Observable<any> {
    return this.bmlService
        .get(BmlRequest.SetReconciled, {
            bwtxnid: id,
            bwpostingid: subPostingId,
            isreconciled: isReconciled,
        })
        .pipe(
            switchMap((response: any) => {
                if (!response.error) {
                    return of(response);
                } else {
                    return throwError({ message: response.error });
                }
            })
        );
}
 

Комментарии:

1. Я считаю, что это .setReconciliationFlag код. Не могли бы вы предоставить его?

2. @Andrey Теперь я добавил .setReconciliationFlag код к вопросу

Ответ №1:

Это означает, что вы ожидали, что результатом будет «сообщение об ошибке», но вместо этого вы получили объект. Итак, вы хотите это:

 error message
 

Вместо этого вы получили это:

 {message: 'error message'}
 

Вам просто нужно правильно использовать переменную, так что, вероятно, это error.error.message

Комментарии:

1. Я попытался изменить код на expect(error.error.message).toEqual('error message'); , но теперь получаю сообщение об ошибке ‘Не удается прочитать свойство’, сообщение ‘не определено брошено’

2. Я также изменил попытку кода на это const errorResponse = { error: 'error message' }; , expect(error).toEqual('error message'); но все равно получил ошибку об ожидаемом объекте

Ответ №2:

давайте посмотрим на реализацию

 ...
switchMap((response: any) => {
      ...
      } else {
        return throwError({ message: response.error }); /// here you are building "error object"
      }
    })
);
 

и тест

 const errorResponse = { error: { message: 'error message' } };
...
.and.returnValue(of(errorResponse));
...
(error: any) => {
   expect(error.message).toEqual('error message');
 

Я не уверен, что реализация не очень хороша или в тесте есть недоразумение, но результирующий объект ошибки будет выглядеть так { message: /* here starts what bmlService.get returns */ { message: 'error message' }}

итак, если вы подтвердите, что реализация в порядке, вы должны исправить утверждение следующим образом

 expect(error.message.message).toEqual('error message');
 

Ответ №3:

Вы передаете значение с:

 .and.returnValue(of(errorResponse));
 

нет и ошибка, так что в вашей подписке вы должны получать это значение в:

 service.setReconciliationFlag(id, subPostingId, isReconciled).subscribe(
        () => {}, // Here
        (error: any) => { // Not Here
            expect(error.message).toEqual('error message');
            done();
        }
    );
 

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

Я бы рекомендовал поместить log.console внутри функций value () и error() подписки, чтобы вы могли видеть, что вы получаете, или отлаживать его в инструментах Chrome Dev Tools в тестовом браузере.

Комментарии:

1. Я только что обновил свой вопрос кодом для setReconciliationFlag

2. Спасибо, не могли бы вы поделиться назначением spyBmlService? Если все правильно, шпион должен запретить вызов вашей службы, чтобы код внутри не использовался. Вы также можете проверить это, чтобы убедиться в этом с помощью журналов или отладки.