使用 Jest 和 React 测试库在本地主机上使用 API 时出现网络错误
Network error while using API on localhost, with Jest & 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';
使用本地主机似乎有问题,因为我收到此错误:
console.error node_modules/@testing-library/react/dist/act-compat.js:52
Error: Error: connect ECONNREFUSED 127.0.0.1:80
at Object.dispatchError (path\node_modules\jsdom\lib\jsdom\living\xhr-utils.js:65:19)
at Request.<anonymous> (path\node_modules\jsdom\lib\jsdom\living\xmlhttprequest.js:676:20)
at Request.emit (events.js:201:15)
at Request.onRequestError (path\node_modules\request\request.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>
);
}
有什么想法吗?
关于你的情况,看起来很容易处理。您不需要任何其他包来模拟您的端点。您可以直接通过 jest
.
模拟 axios
思路是这样的(看看需要添加的行内注释):
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);
});
});
我正在使用 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';
使用本地主机似乎有问题,因为我收到此错误:
console.error node_modules/@testing-library/react/dist/act-compat.js:52
Error: Error: connect ECONNREFUSED 127.0.0.1:80
at Object.dispatchError (path\node_modules\jsdom\lib\jsdom\living\xhr-utils.js:65:19)
at Request.<anonymous> (path\node_modules\jsdom\lib\jsdom\living\xmlhttprequest.js:676:20)
at Request.emit (events.js:201:15)
at Request.onRequestError (path\node_modules\request\request.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>
);
}
有什么想法吗?
关于你的情况,看起来很容易处理。您不需要任何其他包来模拟您的端点。您可以直接通过 jest
.
axios
思路是这样的(看看需要添加的行内注释):
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);
});
});