【问题标题】: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

我的问题是,我是否需要将doneasync/await 一起使用?

【问题讨论】:

标签: javascript node.js async-await jestjs supertest


【解决方案1】:

在同一个测试函数上永远不需要doneasync。选择其中一个,或者,在这种情况下,直接返回承诺:

it("should return 200 OK for POST method", () =>
  request(app).post("SOMEENDPOINT")
    .attach("file", "file")
    .expect(200)
);

Jest 将 await 任何返回的 Promise,这意味着我们总是可以手动构造并返回没有 asyncdone 的 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 不正确。固定。
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多