超测中'done()'的purpose/nature是什么?

What is the purpose/nature of 'done()' in Supertest?

在(非常有限的)documentation of Supertest 中有代码示例,其中传递了一个名为 done() 的回调函数:

describe('GET /user', function() {
  it('responds with json', function(done) {
    request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200, done);
  });
});

这个done()回调的purpose/nature是什么?

您的请求是异步的。

这意味着,除非您能够等待它,否则从第 2 行开始的函数将立即退出。然后 Mocha 将继续进行其他测试,然后突然间,请求承诺将完成并做一些事情,而 mocha 甚至不再查看您的 'responds with json' 规范。

您要实现的行为是发出请求,等待响应,然后测试它是否为 200。

等待响应的方式有3种:

  1. 完成

通过将 done 放入您的 function(done) 调用中,测试框架知道它应该等到完成测试之前调用 done。

  1. returning

正如你在readme(https://github.com/visionmedia/supertest#readme)中看到的那样,还有return的选项呢:

describe('GET /user', function() {
  it('responds with json', function() {
    return request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200);
  });
});

因为 mocha 将等待所有 returned 的承诺。

  1. 异步
describe('GET /user', function() {
  it('responds with json', async function() {
    await request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200);
  });
});