在异步Jest测试中是否需要完成?

时间:2019-11-05 14:23:07

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

我正在与同事讨论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);
});

他对异步/异步的推送没什么问题,但是坚持认为我必须包括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。

我的问题是,我需要在asnyc / await中完全使用完成吗?

1 个答案:

答案 0 :(得分:0)

在同一测试功能上不再需要doneasync。选择一个或另一个。

实际上,在您的特定示例中await不是必需的; async足以指定该函数返回一个promise,并且当它返回时,Jest知道等待其解析:

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

在没有async的情况下退还承诺也可以:

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

这意味着我们总是可以手动构建并返回没有asyncdone的诺言。在这种特殊情况下,这是多余的,因为我们已经承诺要返回,但是以下模式是可能的,即使只是出于说明目的:

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模块中的基本Node库实用程序)。在这种情况下,添加done参数并在回调中调用它比手工实现回调更合适。

请注意,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))
  ;
});