【发布时间】:2020-06-19 03:08:41
【问题描述】:
我很难进行等待上下文新状态的测试。 这是一个简单的应用程序,它在获取用户之前显示加载程序:
(我知道所有代码都不是让应用程序执行其功能所必需的,但它更多地反映了我在实际项目中的实现方式)
export const Greeting: React.FC<{}> = () => {
const { loading, user } = useUserContext();
return (
<div>
{loading ? (
<CircularProgress />
) : (
<h1>
Hello {user.firstname} {user.lastname}
</h1>
)}
</div>
);
};
这是测试:
import React from "react";
import Adapter from "enzyme-adapter-react-16";
import Enzyme, { mount } from "enzyme";
import { Greeting } from "./Greeting";
import { UserContextProvider } from "./UserContext";
Enzyme.configure({ adapter: new Adapter() });
describe("Test of <Greeting />", () => {
it(">>>> should show spinner on loading = true", () => {
const wrapper = mount(<Greeting />);
expect(wrapper.find("ForwardRef(CircularProgress)").exists()).toEqual(true);
});
it(">>>> should show greeting on loading = false", async () => {
const wrapper = mount(
<UserContextProvider>
<Greeting />
</UserContextProvider>
);
const promise = new Promise(resolve => {
setTimeout(() => {
resolve(wrapper);
}, 5000);
});
promise.then((res: Enzyme.ReactWrapper<any>) => {
console.log(res.debug());
expect(res.find("h1").text()).toEqual("Hello Bob Testman");
});
});
});
codesandbox 的链接: https://codesandbox.io/embed/modern-sea-tx3ro?fontsize=14&hidenavigation=1&theme=dark
关于如何解决这个问题的任何想法?
更新 感谢@Noix,这完美无缺
it(">>>> should show greeting on loading = false", async () => {
const wrapper = mount(
<UserContextProvider>
<Greeting />
</UserContextProvider>
);
const promise = () => {
return new Promise(resolve => {
setTimeout(() => {
wrapper.update();
resolve(wrapper);
}, 3000);
});
};
return promise().then((res: Enzyme.ReactWrapper<any>) => {
console.log(res.debug());
expect(res.find("h1").text()).toEqual("Hello Bob Testman");
});
【问题讨论】:
标签: reactjs jestjs enzyme react-context