Как протестировать асинхронный код сервера, используя mocha chai?
В моем наборе mocha-test я хочу протестировать функциональность, которая делает асинхронный вызов за сценой. Как я могу дождаться окончания асинхронного вызова?
Например, я делаю два звонка подряд. Первый пост-вызов также выполняет внутренний асинхронный вызов, пока эта асинхронная операция не будет завершена, второй пост-вызов не пройдет.
Мне нужно одно из следующих:
1) установить задержку между двумя почтовыми вызовами, чтобы убедиться, что асинхронная часть в первом сообщении завершена.
2) повторять второй пост до тех пор, пока он не пройдет.
3) или как проверить асинхронный вызов через мокко-чай?
Ниже приведен пример:
describe('Back to back post calls with asynchronous operation', ()=> {
it('1st and 2nd post', (done) => {
chai.request(server)
.post('/thisis/1st_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
/* HERE I Need A Delay or a way to call
the below post call may be for 5 times */
chai.request(server)
.post('/thisis/second_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
});
done();
});
});
});
Есть ли способ справиться с этим? Пожалуйста помоги.
Благодарю.
1 ответ
Для тестирования асинхронной функции с помощью mocha у вас есть следующие возможности
использование
done
только после последнего обратного вызова в вашей последовательности
it('1st and 2nd post', (done) => {
chai.request(server)
.post('/thisis/1st_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
/* HERE I Need A Delay or a way to call
the below post call may be for 5 times */
chai.request(server)
.post('/thisis/second_post')
.send()
.end((err, res) => {
expect(res.statusCode).to.equal(200);
//call done only after the last callback was executed
done();
});
});
});
использование
done
обратный звонок с обещаниями
describe('test', () => {
it('should do something async', (done) => {
firstAsyncCall
.then(() => {
secondAsyncCall()
.then(() => {
done() // call done when you finished your calls
}
})
});
})
После правильного рефакторинга вы получите что-то вроде
describe('test', () => {
it('should do something async', (done) => {
firstAsyncCall()
.then(secondAsyncCall())
.then(() => {
// do your assertions
done()
})
.catch(done)
})
})
использование
async await
намного чище
describe('test', () => {
it('should do something async', async () => {
const first = await firstAsyncCall()
const second = await secondAsyncCall()
// do your assertion, no done needed
});
})
Другой момент, который нужно иметь в виду, это --timeout
аргумент при запуске тестов мокко. По умолчанию мокко ждет 2000
миллисекунды, вы должны указать большее количество, когда сервер отвечает медленнее.
mocha --timeout 10000