超测中'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种:
- 完成
通过将 done 放入您的 function(done) 调用中,测试框架知道它应该等到完成测试之前调用 done。
- 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 的承诺。
- 异步
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);
});
});
在(非常有限的)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种:
- 完成
通过将 done 放入您的 function(done) 调用中,测试框架知道它应该等到完成测试之前调用 done。
- 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 的承诺。
- 异步
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);
});
});