我的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