Мокко не продолжается после "до", которое включает в себя обещание, просто висит - PullRequest
0 голосов
/ 24 сентября 2018

Мой mocha тестовый зависание, когда я использую обещание внутри before функции.У меня есть следующий before, который вызывает внешнюю функцию, которая возвращает обещание.

describe('User Tests', () => {
  let token = '';
  before(() => {
    const afunc = require('../../../controllers/somefunction');
    return afunc().then((val) => {
      console.log('what is val?', val);
    });
  });

  //... other test are below it like...

  describe('get own profile', () => {
    it('should return profile of logged-in user', (done) => {
      chai.request(app)
        .get('/access/users/profile')
        .set('authorization', `Bearer ${token}`)
        .end((err, res) => {
          expect(res.statusCode).to.equal(200);
          done();
        });
    });
  });

});

afunc из ../../../controllers/somefunction прекрасно работает самостоятельно (возвращается после отключения БД) выглядит следующим образом:

require('dotenv').config();
const mongoose = require('mongoose');
const User = require('../../models/access/user');
// Use native promises
mongoose.Promise = global.Promise;
const db = mongoose.connect(`mongodb://localhost/${availableDBs[dbTarget] || availableDBs.test}`, {
  keepAlive: true,
  reconnectTries: 3,
  useMongoClient: true,
});
// const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));

const dbconnect = () => new Promise((resolve) => {
  db.once('open', () => {
    console.log('DB Open and Listening');
    resolve('DB Open and Listening');
  });
});

const newSuperUser = async () => {
  await dbconnect();
  const user = await User.findOne({ username: data.username.toLowerCase() });
  if (user === null) {
    console.log('Create new user');
    const newUser = await new User(data).save();
    console.log('newUser', newUser);
    if (newUser === null) {
      return console.log('Username already exists.');
    }
    console.log('Successfully created new user.');
  } else {
    console.log('Deleting original user');
    const deleted = await User.findOneAndRemove({ username: data.username });
    console.log('Deleted user', deleted);
    console.log('Create new user after deleting original');
    const newUser = await new User(data).save();
    console.log('newUser', newUser);
    if (newUser === null) {
      return console.log('Username already exists.');
    }
    console.log('Successfully created new user.');
  }

  db.close();

  await new Promise((resolve) => {
    db.on('disconnected', () => {
      console.log('***************************************Mongoose CONNECTION TERMINATED');
      resolve('user ready');
    });
  });
  return true;
};

if (process.argv.some(array => ['test', 'pro', 'dev'].includes(array))) {
  newSuperUser();
}

module.exports = newSuperUser;

console.log показывает, что возвращает значение.Я также попробовал следующий альтернативный способ и получил тот же результат:

describe('User Tests', () => {
  let token = '';
  before((done) => {
    const afunc = require('../../../controllers/somefunction');
    afunc().then((val) => {
      console.log('what is val?', val);
      done();
    });
  });

  //... other test are below it like...

  describe('get own profile', () => {
    it('should return profile of logged-in user', (done) => {
      chai.request(app)
        .get('/access/users/profile')
        .set('authorization', `Bearer ${token}`)
        .end((err, res) => {
          expect(res.statusCode).to.equal(200);
          done();
        });
    });
  });

});

Я даже пытался обернуть before в другой describe, как это (но на тот момент это даже невыполните before больше):

describe('User Tests', () => {
  let token = '';
    describe('User Tests', () => {
    before((done) => {
      const afunc = require('../../../controllers/somefunction');
      afunc().then((val) => {
        console.log('what is val?', val);
        done();
      });
    });
  });

  //... other test are below it like...

  describe('get own profile', () => {
    it('should return profile of logged-in user', (done) => {
      chai.request(app)
        .get('/access/users/profile')
        .set('authorization', `Bearer ${token}`)
        .end((err, res) => {
          expect(res.statusCode).to.equal(200);
          done();
        });
    });
  });

});

Я попытался вернуть обещание и альтернативный метод вызова done().Зачем тут мокко висеть?

Mocha 5.2.0

...