Как протестировать асинхронный код сервера, используя 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

Другие вопросы по тегам