Шутка: шпионские аксиомы в React

Я новичок в Jest (и вообще тестирую JavaScript). У меня есть Register компонент, который по сути представляет собой страницу для регистрации пользователя. Когда форма заполнена и нажата кнопка отправки, она будет использовать axios для отправки POST запроса на сервер.

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

 expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

Вот мой тест:

jest.mock('axios')

it('should save value when submitted', async () => {

            render(
                <Register />
            );

            ReactTestUtils.Simulate.change(field('email'), {
                target: { value: '[email protected]', name: 'email'}
            })

            ReactTestUtils.Simulate.change(field('first-name'), {
                target: { value: 'test', name: 'first-name'}
            })

            ReactTestUtils.Simulate.change(field('last-name'), {
                target: { value: 'test', name: 'last-name'}
            })

            ReactTestUtils.Simulate.change(field('password'), {
                target: { value: 'test', name: 'password'}
            })

            ReactTestUtils.Simulate.change(field('confirm-password'), {
                target: { value: 'test', name: 'confirm-password'}
            })


            const postSpy = jest.spyOn(axios, 'post')

            ReactTestUtils.Simulate.submit(form('register'));

            expect(postSpy).toHaveBeenCalled();

        });

Обычно я заполняю все обязательные поля своей формы, а затем отправляю ее.

Функция, которая обрабатывает отправку в моем Register компоненте, выглядит так:

const onSubmit = data => {
        const res = axios.post("http://localhost/register", data);
    }

Есть идеи, что мне не хватает или что я делаю неправильно?

Спасибо


person MrCujo    schedule 19.07.2021    source источник
comment
Откуда берутся функции field() и form()?   -  person Phil    schedule 19.07.2021
comment
Это просто помощники, которые я определил для получения формы и поля в форме соответственно. Они работают нормально, у меня есть другие тесты, которые их используют   -  person MrCujo    schedule 19.07.2021
comment
Ваш код не вызывает axios.post(), он вызывает axios(), поэтому ваш axios.post шпион никогда не будет вызван   -  person Phil    schedule 19.07.2021
comment
О, да, я это вижу. Я вызываю axios и определяю метод в переданном объекте, я не вызываю axios.post. Заменим свой код и попробую снова. Большое спасибо   -  person MrCujo    schedule 19.07.2021
comment
@Phil Я обновил свой код, чтобы использовать post (код для этого вопроса также был обновлен), но я получаю точно такой же результат   -  person MrCujo    schedule 19.07.2021
comment
Взгляните на этот ответ. Это всегда работает для меня, и вы можете найти подсказки   -  person Phil    schedule 20.07.2021