Jest макет функции выборки из подключенного компонента - PullRequest
0 голосов
/ 31 января 2020

У меня есть код, который работает. Однако для моего теста я хотел бы посмеяться над выборкой, которая делается в компоненте.

Тест

Я пытаюсь следующее:

import ConnectedComponent from './Component';
import { render } from '@testing-library/react';
import user from '../__models__/user'; // arbitrary file for the response

// create a mock response
const mockSuccessResponse = user;
const mockJsonPromise = Promise.resolve(mockSuccessResponse);
const mockFetchPromise = Promise.resolve({
  json: () => mockJsonPromise,
});

// Trying mock the refetch from http
jest.mock('./http', () => {
  return {
    refetch: () => ({
      settingsFetch: () => mockFetchPromise,
    })
  }
});

it('renders', async () => {
  const { getByText } = render(Component);
  const title = await getByText('My title');
  expect(title).toBeInTheDocument();
});

Сообщение об ошибке

При этом я получаю следующую ошибку:

  ● Test suite failed to run

    TypeError: (0 , _http.refetch)(...) is not a function

Код приложения

Этот код отлично работает в моем приложении. Для примера:

. / Http. js

import { connect } from 'react-refetch';

export async function fetchWithToken(urlOrRequest, options = {}) {
  // some stuff
  return response;
}

export const refetch = connect.defaults({
  fetch: fetchWithToken,
});

. / Component.jsx

import { refetch } from './http';

const Component = ({ settingsFetch }) => <AnotherComponent settingsFetch={settingsFetch} />);

const ConnectedComponent = refetch(
  ({
    match: { params: { someId } },
  }) => ({
    settingsFetch: {
      url: 'http://some-url/api/v1/foo'
    }
  })
)(Component)

export default ConnectedComponent;

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


Обновление: оно приближается, выполнив следующие действия:

jest.mock('../helpers/http', () => ({
  refetch: () => jest.fn(
    (ReactComponent) => (ReactComponent),
  ),
}));

Теперь ошибка гласит:

Warning: Failed prop type: The prop `settingsFetch` is marked as required in `ConnectedComponent`, but its value is `undefined`.

Это означает, что мне, вероятно, придется предоставить поддельные ответы для извлечений где-то там.

1 Ответ

0 голосов
/ 31 января 2020

Jest сам отвечает за модули. Таким образом, в следующем примере вы увидите, что модуль из «../http» может быть mocked .

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

jest.mock('../http', () => {
  return {
    refetch: function(hocConf) {
      return function(component) {
        component.defaultProps = {
          ...component.defaultProps,
          settingsFetch: {}, 
          // remember to add a Promise instead of an empty object here
        };
        return component;
      };
    },
  };
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...