Пересмешник с Jest in React - ложная функция не вызывается - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь использовать Jest для юнит-тестирования.Часть тестирования состоит в том, чтобы издеваться над Axios, но по какой-то причине он не вызывается.

Вот мой /__mocks__/axios.js код:

export default {
  post: jest.fn(() => Promise.resolve({})),
};

Вот мой тестовый код:

import mockAxios from 'axios';
import { registerUser } from '../../actions/auth';
import user from '../fixtures/user';


describe('Register User', () => {
  test('Should call register API and redirect to login', async () => {
    const historyMock = { push: jest.fn() };

    mockAxios.post.mockImplementationOnce(() => Promise.resolve());

    await registerUser(user, historyMock);

    expect(mockAxios.post).toHaveBeenCalledTimes(1);

  });
});

Также вот код registerUser:

export const registerUser = (user, history) => dispatch => axios
  .post('/users/register', user)
  .then(() => history.push('/login'))
  .catch((err) => {
    dispatch(handleError(err));
  });

Но по какой-то причине я продолжаю получать сообщение об ошибке:

Register User › Should call register API and redirect to login

    expect(jest.fn()).toHaveBeenCalledTimes(1)

    Expected mock function to have been called one time, but it was called zero times.

      35 |     await registerUser(user, historyMock);
      36 | 
    > 37 |     expect(mockAxios.post).toHaveBeenCalledTimes(1);

Любые идеи, почему макет нерабочий?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Как отметил @jonrsharpe в комментариях, функция registerUser возвращала функцию:

dispatch => axios
  .post('/users/register', user)
  .then(() => history.push('/login'))
  .catch((err) => {
    dispatch(handleError(err));
  });

Поэтому, чтобы это работало, мне пришлось издеваться над магазином, используя модуль redux-mock-store npm.Новый тестовый код выглядит следующим образом:

import mockAxios from 'axios';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';

import { setCurrentUser, registerUser } from '../../actions/auth';
import user from '../fixtures/user';

const defaultStoreState = { errors: {}, auth: { isAuthenticated: false, user: {} } };
const createMockStore = configureMockStore([thunk]);

describe('Register User', () => {
  test('Should call register API and redirect to login', (done) => {
    const mockStore = createMockStore(defaultStoreState);
    const historyMock = { push: jest.fn() };

    mockStore.dispatch(registerUser(user, historyMock)).then(() => {
      expect(mockAxios.post).toHaveBeenCalledTimes(1);
      expect(historyMock.push).toHaveBeenCalledTimes(1);
      expect(historyMock.push).toHaveBeenCalledWith('/login');

      done();
    });
  });
});

Это дает проходной тест сейчас.

0 голосов
/ 28 февраля 2019

Не думаю, что вы правильно настраиваете макет.

mockAxios.post.mockImplementationOnce

должен быть изменен на

mockAxios.post = jest.fn().mockResolvedValueOnce('bloofblurg');

Затем вы можете еще раз проверить, что post был вызван один раз и разрешить ожидаемое значение.

expect(mockAxios.post).resolves.toBe('bloofblurg');

см.

  1. https://jestjs.io/docs/en/mock-function-api#mockfnmockresolvedvalueoncevalue
  2. https://jestjs.io/docs/en/expect#resolves
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...