我很难进行测试以等待上下文的新状态。 这是一个简单的应用程序,它显示加载程序,直到获取用户为止:
(我知道要使应用程序执行其工作并不需要所有代码,但是它更多地反映了我在真实项目中的实现方式)
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");
});
});
});
链接到codeandbox: 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");
});
答案 0 :(得分:1)
我相信您遇到了麻烦,因为Jest在您的诺言完成之前就结束了测试。尝试在“ promise.then”之前添加语句“ return”,这样Jest将能够等待您的诺言结束,然后再结束测试。
据此:
https://jestjs.io/docs/en/asynchronous.html
除非有以下条件,否则玩笑不会等待回调返回:
选项1:您将完成作为参数添加到函数“它”,因此测试仅在调用函数完成时才能解决(在这种情况下,您需要使用try catch来确保始终调用完成)>
选项2:您使用了诺言,这是最简单的方法,但永远不会忘记返回您的诺言:)
选项3:您可以使用语句“ await”来实现诺言,然后必须在“ it”函数上使用关键字async
因此,在您的情况下,您可以等待诺言等待其结束,也可以只返回诺言。希望对您有所帮助。
干杯:)