【发布时间】:2020-12-28 01:41:49
【问题描述】:
我已经为此奋斗了几天,但我无法正确地做我需要的事情。 基本上我有一个提供从 API 获取的主题的上下文。上下文具有主题、加载和获取和更新加载状态的函数的值。看起来是这样的:
import React, { useState } from "react";
import ThemeService from "../services/GetThemes";
const AvailableThemesContext = React.createContext();
const { Provider, Consumer } = AvailableThemesContext;
const ThemesProvider = ({ children }) => {
const [contextTheme, setTheme] = useState({});
const [loading, setLoading] = useState(true);
function handleData(data) {
setTheme(data);
setLoading(false);
}
function fetchThemes() {
setLoading(true);
new ThemeService().getData(handleData);
}
function refresh(data) {
setTheme(data);
}
return (
<Provider value={{ contextTheme, fetchThemes, refresh, setLoading, }}>
{children}
</Provider>
);
};
export { ThemesProvider, Consumer as ThemeConsumer, AvailableThemesContext };
这就是我在 index.js 文件中向应用程序提供所述上下文的方式:
import { ThemesProvider } from "./context/ThemeProvider";
ReactDOM.render(
<ThemesProvider value={{}}>
<App />
</ThemesProvider>,
document.getElementById("root")
);
在子组件中,有一个useEffect 查看loadingstate 以呈现微调器或其他一些东西。默认呈现微调器。然后我尝试将loading 的状态更改为false,但我无法做到。
这是我的测试:
import React from "react";
// import { render } from "@testing-library/react";
import { render, screen } from "./test-utils";
import CalendarView from "../views/CalendarView";
import AvailableThemesContext from "../context/ThemeProvider";
const { loading } = AvailableThemesContext;
describe("<CalendarView />", () => {
test("It renders without crashing", async () => {
const { getByLabelText } = render(<CalendarView />);
expect(getByLabelText("audio-loading")).toBeInTheDocument();
// ---> This looks for the loader ands resolves OK
});
test("It renders without crashing", () => {
const renderComponent = render(
<ThemeProvider value={{ loading: false}}>
<CalendarView />);
</ThemesProvider>
expect(renderComponent.getByTestId("picker-component")).toBeInTheDocument();
});
});
关于我尝试注入新状态的更多信息,组件永远不会看到更改。
请帮忙?
【问题讨论】:
标签: javascript reactjs jestjs react-testing-library react-context