【发布时间】:2021-07-11 07:37:21
【问题描述】:
我有一个名为 Home.jsx 的组件,它借助 axios 实例在 useEffect 中进行异步调用。现在,在 Home.test.jsx 中为 Home 编写测试时,我遇到了这个 API 调用的问题,因为 API 调用需要授权,并且测试是在终端而不是浏览器中运行的。如果我使用findBy 或waitFor,那么API 调用应该会失败,因为没有发生授权。我正在使用axios.create({}) 实例,没有其他问题对我有帮助。
//Home.jsx
import services from "../../Services/patientServices";
const Home = () => {
const [patientSets, setPatientSets] = useState([]);
const fetchPatientSets = async () => {
try {
const result = await services.patientSets();
console.log('Data => ', result);
setPatientSets(result.data);
}
catch(err) {
setPatientFetching(false);
}
}
useEffect(() => {
fetchPatientSets();
}, []);
}
//Services.js
import apiClient from "./apiClient";
const patientSets = async () => {
return await apiClient().get(`patient_sets`);
};
//ApiClient.js
const apiClient = () => {
const access_token = localStorage.getItem("access_token");
const instance = axios.create({
baseURL: window.config.apiUrl,
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${access_token}`,
},
responseType: "json"
});
return instance;
}
//Home.test.jsx
import React from 'react';
import { render, screen } from '../../setupTests';
import Home from './Home';
describe('Home', () => {
test('Test refresh button in the table', async () => {
const { container } = render(<Home />);
expect(await screen.findBy('async data').toBeInTheDocument();
});
});
【问题讨论】:
-
您不需要模拟 Axios 来进行单元测试
Home,只需patientSets。您也可以使用 MSW 之类的东西,请参阅我写的示例 here。但到目前为止,您似乎还没有尝试模拟 任何东西。
标签: reactjs unit-testing jestjs react-testing-library