У меня есть код, который работает. Однако для моего теста я хотел бы посмеяться над выборкой, которая делается в компоненте.
Тест
Я пытаюсь следующее:
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`.
Это означает, что мне, вероятно, придется предоставить поддельные ответы для извлечений где-то там.