Насмешка Axios Отклонить вызов отдыха

У меня есть служебный класс:

utils.ts

import axios, { AxiosResponse } from 'axios';
import { throwError } from 'rxjs';

axios.defaults.withCredentials = true;
axios.defaults.responseType = 'json';

export class UserUtils {

    public updateUserData(data) {
        return axios.post('http://mock.rest.server.com:1234/rest/update/user/', data, 
            {
                withCredentials: true,
                responseType: 'json' as 'json
            })
            .then(resp => {
                return resp;
            })
            .catch(error => {
                return throwError('error updating user data');
            });
    }

}

И мои классы компонентов вызывают вышеизложенное в соответствии с:

userComponent.ts

export class UserComponent {
    import { UserUtils } from './utils';
    

    public userUtils: UserUtils = new UserUtils();


    // Btn click method
    public update(content) {
        this.userUtils.updateUserData(content) // <-- call made here
           .then((data) => {

               this.showSuccessModal(); // <- trying to test this

           }, (err) => {

               this.showErrorModal(error); // <- trying to test this

           });
    }

}

Я пытаюсь протестировать положительные (showSuccessModal)/отрицательные (showErrorModal) сценарии на userComponent.ts

userComponent.spec.ts

import { UserComponent } from '../../../user/userComponent';
import { UserUtils } from '../../../user/utils';


 describe('User Comp test', () => {

     beforeAll(done => (async () => {

         Testbed.configureTestingModule({
             declarations: [
                 UserComponent
             ]
         });
         await TestBed.compileComponents();
     })().then(done).catch(done.fail);

     describe('User Comp (with beforeEach)', () => {
         let component: UserComponent;
         let fixture: ComponentFixture<UserComponent>;

         beforeEach(() => {                 
             fixture = await TestBed.createComponent(UserComponent);
             component = fixture.componentInstance;
         });

         it('should show error modal', () => {
             let errorModal = spyOn(component, 'showErrorModal');
             spyOn(component.userUtils, 'updateUserData').and.returnValue(Promise.reject('error updating'));

             component.update({test: 'test');
             expect(errorModal).toHaveBeenCalled();
         });
     });
 }

Однако при запуске тестов я вижу:

Error: Expected spy showErrorModal to have been called
    at <Jasmine>

Похоже, в тесте всегда назывался «успешный» маршрут.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю

.catch(error => {
    return throwError('error updating user data');
});

разрешение является наблюдаемым, вы пытаетесь:

.catch(error => {
    throw 'error updating user data';
});

Спасибо. Должно ли это иметь значение, учитывая, что я слежу за вызовом утилит? т.е.: spyOn(component.userUtils, 'updateUserData').and.returnValue(Promise.reject('обновление ошибки'));

Oam Psy 23.11.2022 13:51
Ответ принят как подходящий

Выяснил решение - это callFake, а затем отклонить обещание:

import { UserComponent } from '../../../user/userComponent';
import { UserUtils } from '../../../user/utils';


 describe('User Comp test', () => {

     beforeAll(done => (async () => {

         Testbed.configureTestingModule({
             declarations: [
                 UserComponent
             ]
         });
         await TestBed.compileComponents();
     })().then(done).catch(done.fail);

     describe('User Comp (with beforeEach)', () => {
         let component: UserComponent;
         let fixture: ComponentFixture<UserComponent>;

         beforeEach(() => {                 
             fixture = await TestBed.createComponent(UserComponent);
             component = fixture.componentInstance;
         });

         it('should show error modal', () => {
             let errorModal = spyOn(component, 'showErrorModal');
             let spyPromise = spyOn(component.userUtils, 'updateUserData').and.returnValue(Promise.resolve({status: 200....}));

             component.update({test: 'test');
             expect(errorModal).not.toHaveBeenCalled();

             errorModal.mockClear();
             spyPromise.mockClear();
             spyPromise.and.callFake(() => Promise.reject());

             component.update({test: 'test');
             expect(errorModal).toHaveBeenCalled();
         });
     });
 }

Другие вопросы по теме