在异步 Jest 测试中是不是需要完成?
Posted
技术标签:
【中文标题】在异步 Jest 测试中是不是需要完成?【英文标题】:Is done required in async Jest tests?在异步 Jest 测试中是否需要完成? 【发布时间】:2020-03-01 22:44:01 【问题描述】:我在 Jest 测试中与一位同事争论 done()
。
他在 javascript 方面的经验比我多几个数量级,我是在 async
/await
被普遍接受之后进来的,加上来自 .NET 环境,所以我已经习惯了。
我这样写我的测试:
it("should return 200 OK for POST method", async () =>
await request(app).post("SOMEENDPOINT")
.attach("file", "file")
.expect(200);
);
他更习惯于承诺,所以会这样写他的测试:
it("should return 200 OK for POST method", (done) =>
request(app).post("SOMEENDPOINT")
.attach("file", "file")
.expect(200, done);
);
他对我推送到async
/await
没有意见,但坚持我必须包括done
,这样我要么做他的版本修改版本:
it("should return 200 OK for POST method", async (done) =>
await request(app).post("SOMEENDPOINT")
.attach("file", "file")
.expect(200, done);
);
或者:
it("should return 200 OK for POST method", async (done) =>
const res = await request(app).post("SOMEENDPOINT")
.attach("file", "file");
expect(res.status).toBe(200);
done();
);
虽然我认识到在将 done()
作为参数包含时调用它是完全必要的,但我的印象是在这种情况下使用 async
/await
时完全没有必要。
请求是supertest.request
。
我的问题是,我是否需要将done
与async
/await
一起使用?
【问题讨论】:
如您在文档中所见,不需要:jestjs.io/docs/en/tutorial-async.html#async-await 这也是我最初的论点。 【参考方案1】:在同一个测试函数上永远不需要done
和async
。选择其中一个,或者,在这种情况下,直接返回承诺:
it("should return 200 OK for POST method", () =>
request(app).post("SOMEENDPOINT")
.attach("file", "file")
.expect(200)
);
Jest 将 await
任何返回的 Promise,这意味着我们总是可以手动构造并返回没有 async
或 done
的 Promise。这是多余的,因为我们手头已经有一个承诺,但以下pattern 是可能的,如果仅用于说明目的:
it("should return 200 OK for POST method", () =>
return new Promise((resolve, reject) =>
request(app).post("SOMEENDPOINT")
.attach("file", "file")
.expect(200, resolve)
.catch(err => reject(err))
;
);
);
done
通常用于测试异步回调(想想fs
模块中的基本节点库实用程序)。在这些情况下,添加done
参数并在回调中调用它比手动承诺回调更优雅。从本质上讲,done
是一种承诺的捷径,它抽象出了上面显示的new Promise
样板。
请注意,done
可以接受被视为错误的参数(请参阅docs)。这应该进入任何catch
块,以避免在调用done
之前抛出主行代码时出现超时和令人困惑的错误:
it("should return 200 OK for POST method", done =>
request(app).post("SOMEENDPOINT")
.attach("file", "file")
.expect(200, done)
.catch(err => done(err))
;
);
【讨论】:
"async
足以指定该函数返回一个承诺,当它返回时,Jest 知道await
的分辨率"。这是否意味着如果我愿意,我可以使用await
?因为使用await
对我不起作用(超时),并且删除它可以按预期工作。
是的,我的初始代码 sn-p 不正确。固定。以上是关于在异步 Jest 测试中是不是需要完成?的主要内容,如果未能解决你的问题,请参考以下文章
Jest + React-testing-library-等待模拟的异步功能完成