[英]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() 有机会执行回调。
所以如果我不return
, expect(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 可能会出现两件事错误:
.then()
根本不会触发。 甚至可能没有超时,因为您的测试会立即返回。测试 Promise 的更好方法:
test("Asynchronous code", async () => {
const res = await Promise.resolve("data");
expect(res).toBe("data");
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.