让笑话/酶测试等待上下文

Posted

技术标签:

【中文标题】让笑话/酶测试等待上下文【英文标题】:Make jest/enzyme test wait for context 【发布时间】: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");
);

【问题讨论】:

【参考方案1】:

我相信您遇到了麻烦,因为 Jest 在您的承诺完成之前结束了测试。尝试在“promise.then”之前添加语句“return”,以便 Jest 能够在结束测试之前等待您的承诺结束。

据此:

https://jestjs.io/docs/en/asynchronous.html

Jest 不等待回调返回,除非:

选项 1:您将 done 作为参数添加到您的函数“it”,因此测试仅在您调用函数 done 时才解析(在这种情况下,您需要使用 try catch 以确保始终调用 done)

选项 2:你使用一个承诺,这是最简单的,但永远不要忘记返回你的承诺 :)

选项 3:您可以使用语句“await”作为您的承诺,但是您必须在您的“it”函数上使用关键字 async

因此,在您的情况下,您可以在您的承诺上放置一个 await 以等待它结束,或者只是返回您的承诺。我希望这会有所帮助。

干杯:)

【讨论】:

以上是关于让笑话/酶测试等待上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何使用酶、笑话和反应测试材料设计事件监听器

用笑话和酶覆盖无操作功能

笑话:节点模块依赖使用导入语句并导致测试崩溃

带有笑话和酶的反应单元测试

笑话:等待异步测试完成后再运行下一个测试

如何在 Vue 笑话测试中等待引导模式动画完成