Мой 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