摩卡后未延续“前”,包括一个承诺,只是挂起(Mocha not continuing after “

2019-10-29 04:51发布

我的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 (DB断开连接后收益)自身的正常工作如下所示:

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

文章来源: Mocha not continuing after “before” that includes a promise, just hangs