Поэтому я хотел бы очистить свой db (до или) после некоторого модульного тестирования.
В основном код, который вы увидите в моих afterAll
блоках, находится в блоке afterAll
от afterAll
. Я использую webdriver.io testrunner для запуска моих тестов.
Я не понимаю, как использовать материал db извне области подключения, см.
function createConnection(){
MongoClient.connect('mongodb://127.0.0.1:24001/meteor', function(err, db) {
if (err)
throw err;
console.log("connected to the mongoDB !");
let myCollection = db.collection('test_collection');
// do stuff with myCollection
});
}
Я бы предпочел, если возможно, что-то вроде этого:
function createConnection(){
MongoClient.connect('mongodb://127.0.0.1:24001/meteor', function(err, db){
if (err)
throw err;
}
}
function getCollection(name){
return db.collection(name) //don't have db at this scope, problem?
}
//app.js
createConnection();
let myCollection = getCollection('data');
...//do stuff with myCollection
closeConnection();
Это возможно?
Если вы хотите подключиться к базе данных MongoDB так, как вы описываете, вы можете использовать обещания JavaScript, чтобы убедиться, что вы определили db
при вызове getCollection
. Код, который вы включили бы в ваш блок afterAll
будет выглядеть следующим образом:
function createConnection(connection) {
// return a promise
return new Promise((resolve, reject) => {
MongoClient.connect('mongodb://127.0.0.1:24001/meteor', function (err, db) {
if (err) {
// rejects with error if connection fails
reject(err);
}
// returns handle to database if connection successful
resolve(db);
});
});
}
// function takes handle to database and collection name
function getCollection(db, name) {
return db.collection(name);
}
// test it works
createConnection().then((db) => {
let myCollection = getCollection(db, 'foo');
// do stuff with one collection
// e.g. myCollection.deleteOne({ foo: 1 });
// ...
// do stuff with another collection
myCollection = getCollection(db, 'bar');
// e.g. myCollection.insert({ bar: 1 });
// ...
// ensure you catch any errors and log them to the console
}).catch(console.error);
Обратите внимание, что я использовал немного синтаксиса ES6 по привычке, но он работает точно так же с ES5.
Эмпирическое правило состоит в том, что вы всегда издеваетесь над такими вещами, как базы данных или http-запросы в своих тестовых случаях. Посмотрите на что-то вроде mongo-mock и используйте его вместо этого.