【问题标题】:Jest async test always times out when used with mongodb-memory-server与 mongodb-memory-server 一起使用时,Jest 异步测试总是超时
【发布时间】:2020-11-19 22:50:41
【问题描述】:

我正在使用 mongodb-memory-server 包,但在让我的异步笑话测试正常运行时遇到了一些麻烦。我有一个连接到内存 mongo 数据库的 beforeAll:

beforeAll(async () => await connect());

然后我有一个异步测试:

it("creates a new user", async () => {
      const userObj = {
        firstName: faker.name.firstName(),
        lastName: faker.name.lastName(),
        phoneNumber: "+14444444444",
        uid: faker.random.uuid(),
      };
      const userRes = await axios.post(routeUrl + "/", userObj);
      const createdUser = userRes.data.user;
      expect(createdUser._id).toBeTruthy();
  });

问题是我的测试总是超时,因为它既是异步的,又包括一个使用 mongodb-memory-server 修改某些数据的端点。如果我要删除异步并将 userRes 之后的逻辑放在 .then 中,则测试通过。如果我保留 async/await 但在 1000 毫秒异步超时中将代码包装在测试中,则测试通过。关于为什么以上面显示的当前格式测试超时的任何想法?

这是一个通过测试的示例:

it("creates a new user", () => {
      const userObj = {
        firstName: faker.name.firstName(),
        lastName: faker.name.lastName(),
        phoneNumber: "+14444444444",
        uid: faker.random.uuid(),
      };
      axios.post(routeUrl + "/", userObj).then(
         userRes => {
             const createdUser = userRes.data.user;
             expect(createdUser._id).toBeTruthy();
         }
      );
  });

【问题讨论】:

  • 能分享一下传的版本吗?可能是您的带有 .then 的版本没有返回承诺,所以 jest 没有等待它“通过测试”。您还可以通过添加 jestjs.io/docs/en/expect#expectassertionsnumber 检查来确认运行的检查。
  • @dcwither 刚刚添加了一个通过测试的示例
  • 你为什么不使用 jest.mock 模拟 mongodb 的东西,并使用类似 npmjs.com/package/supertest 的东西来测试应用程序路由器?
  • 我的解释是这是一个端到端/集成测试,所以我没有对此发表评论,但如果这是一个单元测试,那么 Max 的问题指出了一些有价值的资源。

标签: node.js mongodb typescript async-await jestjs


【解决方案1】:

看起来您通过的.then 测试实际上并未完成。在async 测试中,await 确保 promise 在 async 函数解析之前完成。

在您通过.then 测试中,它实际上并没有在测试“通过”之前运行检查。为了解决此问题并获得准确的测试,您可以进行以下更改:

it("creates a new user", () => {
  expect.assertions(1);
  const userObj = {
    firstName: faker.name.firstName(),
    lastName: faker.name.lastName(),
    phoneNumber: "+14444444444",
    uid: faker.random.uuid(),
  };
  return axios.post(routeUrl + "/", userObj).then((userRes) => {
    const createdUser = userRes.data.user;
    expect(createdUser._id).toBeTruthy();
  });
});

您应该会发现这也会超时。

此更改(添加returnexpect.assertions)确保承诺在测试完成之前解决。您可以查看 Jest 的 async example,了解有关其工作原理的更多详细信息。

使用expect.assertions(number) 非常有用,可以确保异步测试实际上是在测试您打算测试的内容。

为了解决超时问题(如果问题是 1000 毫秒太小),您可以使用 3rd argument to it/test 显式设置超时。

it("creates a new user", () => {...}, 2000)

【讨论】:

    【解决方案2】:

    您可以将'done' callbacktestTimeout 一起使用。

    【讨论】:

    • 您的答案包含一个指向自身的链接,也许您应该编写一些代码来演示问题的答案。
    猜你喜欢
    • 2021-03-09
    • 2021-02-01
    • 1970-01-01
    • 2019-05-25
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多