Правильный способ использования done () при тестировании asyc / await с mocha - PullRequest
0 голосов
/ 21 сентября 2018

Я практикую базовые юнит-тесты с mocha и немного запутанным КАК и КОГДА для использования обработчика done () .

  1. Как использовать done()?

Ниже приведен мой пример кода, где я не могу использовать done:

it('Testing insertDocumentWithIndex', async (done) => {
  try{
    var data = await db.insertDocumentWithIndex('inspections', {
      "inspectorId" : 1,
      "curStatus" : 1,
      "lastUpdatedTS" : 1535222623216,
      "entryTS" : 1535222623216,
      "venueTypeId" : 1,
      "location" : [
        45.5891279,
        -45.0446183
      ]
    })
    expect(data.result.n).to.equal(1);
    expect(data.result.ok).to.equal(1);
  }
  catch(e){
    logger.error(e);
    done(e);
  }
})

При запуске происходит сбой и выдается ошибка -

Ошибка: превышено время ожидания 2000 мс.Для асинхронных тестов и хуков убедитесь, что вызывается «done ()»;если вы возвращаете обещание, убедитесь, что оно разрешено.

Но done следует вызывать только в случае сбоя (простите, если я что-то говорю неправильно, я новичок), что я и сделалв catch блоке и приходе ко второй точке возврата Обещания, хорошо, что отлично работает.См. Ниже код

it('Testing insertDocumentWithIndex', async () => {
  return new Promise(async (resolve, reject) => {
    try{
      var data = await db.insertDocumentWithIndex('inspections', {
        "inspectorId" : 1,
        "curStatus" : 1,
        "lastUpdatedTS" : 1535222623216,
        "entryTS" : 1535222623216,
        "venueTypeId" : 1,
        "location" : [
          45.5891279,
          -45.0446183
        ]
      })
      expect(data.result.n).to.equal(1);
      expect(data.result.ok).to.equal(1);
      resolve()
    }
    catch(e){
      reject(e);
    }
  })
});

Но для этого требуется дополнительный код конструкции Promise, но это не проблема.Но возникает другой вопрос

КОГДА следует использовать done?

Любая помощь или предложение для лучшего подхода к написанию тестовых случаев с mocha помогут.

1 Ответ

0 голосов
/ 21 сентября 2018

Правильный способ - не использовать done с async..await.Mocha поддерживает обещания и может связывать обещания, возвращаемые функциями it и т. Д.И функция async является синтаксическим сахаром для функции, которая всегда возвращает обещание:

it('Testing insertDocumentWithIndex', async () => {
    var data = await db.insertDocumentWithIndex('inspections', {
      "inspectorId" : 1,
      "curStatus" : 1,
      "lastUpdatedTS" : 1535222623216,
      "entryTS" : 1535222623216,
      "venueTypeId" : 1,
      "location" : [
        45.5891279,
        -45.0446183
      ]
    })
    expect(data.result.n).to.equal(1);
    expect(data.result.ok).to.equal(1);
})

done требуется только для тестирования асинхронных API, а не для обещаний.Даже тогда преобразование в обещания часто приводит к более чистому потоку управления.

И этот

it('Testing insertDocumentWithIndex', async () => {
  return new Promise(async (resolve, reject) => {
  ...

является антипаттерном построения обещаний, что еще хуже из-за async обратного вызова конструктора обещаний.

...