#reactjs #unit-testing #axios #jestjs #react-testing-library
#reactjs #модульное тестирование #axios #jestjs #react-testing-library
Вопрос:
Я использую библиотеку тестирования React и Jest и пытаюсь имитировать запрос GET на мой серверный сервер, который также выполняется на моем локальном хосте (на другом порту).
import * as React from "react";
import { render } from "@testing-library/react";
import FetchMock from "jest-fetch-mock";
import MyComponent from "../MyComponent";
describe("MyComponent", () => {
beforeEach(() => {
FetchMock.resetMocks();
});
it("renders correct data", async () => {
const mockData = { data: "foo" };
FetchMock.once(JSON.stringify(mockData))
const { findAllByText } = render(
<MyComponent url={'localhost:4000'} />
);
const text= await findAllByText(/foo/);
expect(text).toHaveLength(1);
});
});
В моей конфигурации тестов я также добавил эту строку:
axios.defaults.baseURL = 'http://localhost:4000';
Похоже, что есть проблема с использованием localhost, поскольку я получаю эту ошибку:
console.error node_modules/@testing-library/react/dist/act-compat.js:52
Error: Error: connect ECONNREFUSED 127.0.0.1:80
at Object.dispatchError (pathnode_modulesjsdomlibjsdomlivingxhr-utils.js:65:19)
at Request.<anonymous> (pathnode_modulesjsdomlibjsdomlivingxmlhttprequest.js:676:20)
at Request.emit (events.js:201:15)
at Request.onRequestError (pathnode_modulesrequestrequest.js:877:8)
at ClientRequest.emit (events.js:196:13)
at Socket.socketErrorListener (_http_client.js:402:9)
at Socket.emit (events.js:196:13)
at emitErrorNT (internal/streams/destroy.js:91:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
at processTicksAndRejections (internal/process/task_queues.js:83:17) undefined
Это мой компонент ( MyComponent.js
):
import React from 'react';
import axios from 'axios';
export default function MyComponent(url) {
const [data, setData] = React.useState('');
React.useEffect(() => {
const getData = async () => {
axios.get(`${url}/foo`)
.then(res => {
setData(res.data)
})
};
getData();
}, []);
return (
<h1>{data}</h1>
);
}
Есть идеи?
Комментарии:
1. Можете ли вы также поделиться своим полным кодом?
2. Вы имеете в виду код компонента? В компоненте я отправляю запрос GET на данный API (localhost: 4000 / endpoint)
3. Я собираюсь проверить, используете ли вы
axios
в своей реализации. Если вы используете его, почему бы вамjest-mock-axios
этого не сделать?4. Хорошая мысль, спасибо! Я пробовал это также с
jest-mock-axios
помощью, но все еще получаю ту же ошибку. Кстати, я добавил код компонента в описание.
Ответ №1:
Что касается вашего случая, с ним, похоже, довольно легко справиться. Вам не нужен какой-либо другой пакет, чтобы имитировать вашу конечную точку. Вы можете издеваться axios
напрямую через jest
.
Вот идея (взгляните на встроенные комментарии, которые вам нужно добавить):
import * as React from "react";
import { render } from "@testing-library/react";
import axios from "axios";
import MyComponent from "../MyComponent";
// Mock axios directly
jest.mock('axios')
describe("MyComponent", () => {
it("renders correct data", async () => {
const mockData = { data: "foo" };
// Mock returning your value
axios.get.mockResolvedValue(mockData);
const { findAllByText } = render(
<MyComponent url={'localhost:4000'} />
);
const text= await findAllByText(/foo/);
expect(text).toHaveLength(1);
});
});