繁体   English   中英

为什么要在 Jest 的基于 Promise 的测试中“返回”?

[英]Why "return" on a promise-based test with Jest?

这是一个 Jest 测试示例:

test("Asynchronous code", () => {
    return Promise.resolve("data").then(res => {
        expect(res).toBe("data");
    });
});

Jest 的文档表明我们必须在测试中return Promise,因为没有return

您的测试将在 promise 返回 [...] 之前完成,然后 then() 有机会执行回调。

所以如果我不returnexpect(res).toBe("data")将永远不会被执行。

但是我进行了测试,无论是否return (使用.resolves.rejects ),它的工作原理都是一样的。

可以肯定的是,我编写了一个没有return应该失败的测试:

test("Asynchronous code", () => {
    Promise.resolve("data").then(res => {
        expect(res).toBe("a failure");
    });
});
  • 如果从不执行expect(res).toBe("data") ,则测试将通过:需要return
  • 如果断言经过良好测试,则测试失败:我们需要return什么?
 FAIL  Cours-Jest/--test--/test.js
  ● Asynchronous code

    expect(received).toBe(expected) // Object.is equality

    Expected: "a failure"
    Received: "data"

所以断言被正确执行。 为什么我们必须return 我错过了什么?

从文档:

从您的测试中返回 promise,Jest 将等待 promise 解决。 如果 promise 被拒绝,测试将失败。

因此,当您异步执行某些操作并且不返回 promise 时,go 可能会出现两件事错误:

  1. 因此,当您的 promise 实际上异步执行一些需要比测试超时更长的时间时……您的.then()根本不会触发。 甚至可能没有超时,因为您的测试会立即返回。
  2. 当您的 promise 被拒绝时,错误将被忽略。

测试 Promise 的更好方法:

test("Asynchronous code", async () => {
    const res = await Promise.resolve("data");
    expect(res).toBe("data");
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM