Я пытаюсь написать тесты для моего Node API с Mocha
и Supertest
.
Мне удалось использовать обещания с .then
, но это быстро превратилось в ад "обратного вызова", который трудно поддерживать в долгосрочной перспективе.
// Success using `.then`
describe('/categories', () => {
it('GET-/categories ,should contain 2 category documents after creating', done => {
request(app)
.post('/categories')
.send({
name: 'user1',
})
.then(res => {
request(app)
.post('/categories')
.send({
name: 'user2',
})
.then(res => {
request(app)
.get('/categories')
.then(res => {
const categories = res.body;
expect(categories.length).to.equal(2);
done();
});
});
})
.catch(err => done(err));
});
});
Теперь я пытаюсь написать это с async
await
, но возвращает ошибку.
// DOES NOT WORK using `async`/`await`
describe('/categories', () => {
it('GET-/categories ,should contain 2 category documents after creating', async done => {
try {
const category1 = await request(app)
.post('/categories')
.send({
name: 'user2',
});
const category2 = await request(app)
.post('/categories')
.send({
name: 'user2',
});
const categories = await request(app).get('/categories');
const result = categories.body;
expect(result.length).to.equal(2);
done();
} catch (e) {
done(e);
}
});
});
Ошибка: метод разрешения слишком задан. Укажите обратный вызов или вернуть обещание; не оба.
При исследовании этой проблемы я обнаружил некоторые темы, которые рекомендовали пропустить done()
, поэтому я сделал, но тест не работал должным образом. Они даже потерпели неудачу, утверждая, что получили пропуск.
// DOES NOT WORK using `async`/`await` without `done()`
describe('/categories', () => {
it('GET-/categories ,should contain 2 category documents after creating', async () => {
try {
const category1 = await request(app)
.post('/categories')
.send({
name: 'user2',
});
const category2 = await request(app)
.post('/categories')
.send({
name: 'user2',
});
const categories = await request(app).get('/categories');
const result = categories.body;
expect(result.length).to.equal(2);
} catch (e) {
console.log(e);
}
});
});