Не уверен насчет использования асинхронных и обратных вызовов в JavaScript - PullRequest
0 голосов
/ 02 октября 2018

Описание:

У меня в моем Node-App есть тест Mocha, который должен проверить, правильно ли выполнен DB-экспорт Mongo-DB-JSON-Documents.В моем тесте я, помимо других тестов, также проверяю, не является ли каталог загрузки пустым.

Ожидаемый результат:

Тест должен ожидать загрузки и только после этого проверять, является ли каталог пустым.

Фактический результат:

Тест возвращается всегда зеленым.

Мой вопрос:

Я понял, что у нас есть обратные вызовы, но обещания лучше.Я понял, что async await - это какой-то синтаксический сахар для обещаний.И я понял, что есть даже RxJS (который я здесь не использую)

Каким-то образом мне приходится иметь дело с обратным вызовом из mogodb-backup.См. https://www.npmjs.com/package/mongodb-backup

Я не понимаю, что я делаю неправильно, поэтому тесты всегда становятся зелеными (работает параллельно с загрузкой)

mocha-test.js

describe('Database.downloadDocumentsOfType_KEYS()', function () {
  it('should result in data/exportFromCosmos/KEYS/admin/ag-data/ not being empty', function () {
    const config = {
      documents: ['DEFAULT', 'KEYS'],         
      exportpathDEFAULT: 'data/exportFromCosmos/DEFAULT/',
      exportpathKEYS: 'data/exportFromCosmos/KEYS/',
      uploadpath: 'data/uploadToAzureBlob/',
      crosscheckFile: 'data/crosscheckFile.txt'
    }

    async function f() {
      await Database.downloadDocumentsOfType_KEYS().then(expect(dir(config.exportpathKEYS + 'admin/ag-data/')).to.not.be.empty)
    }

    f()
  })
})

Databasemodule-to-be-test.js

const mongodbbackup = require('mongodb-backup')

const Database = {
  downloadDocumentsOfType_DEFAULT: () => {
  new Promise((resolve) => mongodbbackup({
    uri: process.env.DB_CONNECTION_STRING_READ,
    root: 'data/exportFromCosmos/DEFAULT',
    parser: 'json',
    callback: function(err) {
      if (err) {
        reject()
      } else {
        resolve()
      }
    }
  )}
}

1 Ответ

0 голосов
/ 02 октября 2018
async function f() {
  await Database.downloadDocumentsOfType_KEYS().then(e)
}

f()

Это немедленно запускает асинхронную функцию и

it('...', function (){}) 

немедленно завершается.

Так что вам нужно использовать

describe('...',async function(){
  it('...',async function(){
   const f = async function(){
     await Database.downloadDocumentsOfType_KEYS();
     expect(dir(config.exportpathKEYS + 'admin/ag-data/')).to.not.be.empty);
   };
   await f();
  });
});

Также

new Promise((resolve) => mongodbbackup({...

должно быть

new Promise((resolve,reject) => mongodbbackup({

В противном случае отклонение равно undefined

...