2017-09-21 1 views
1

Donc, je voudrais nettoyer mon db (avant ou) après quelques tests unitaires.Accès Mongodb en test moka

Fondamentalement, le code que vous verrez dans mes blocs de code est dans le bloc afterAll de moka. J'utilise webdriver.io testrunner pour exécuter mes tests.

Ce que je ne comprends pas, comment utiliser des trucs db en dehors du champ de connexion, voir:

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 

    }); 
} 

je préférerais, si possible, quelque chose comme ceci:

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(); 

Est-ce possible?

+0

Essayez-vous d'accéder à la base de données réelle? – lukaleli

+0

oui mongodb 2.6.7, ou comment puis-je comprendre votre question? – Gobliins

+0

C'est une mauvaise idée. Vous vous moquez toujours de la base de données pour vos tests. La même chose s'applique aux demandes http. Regardez quelque chose comme https://github.com/williamkapke/mongo-mock et utilisez-le à la place de la base de données réelle. – lukaleli

Répondre

0

La règle générale est que vous vous moquez toujours des choses comme les bases de données ou les requêtes http dans vos scénarios de test. Jetez un oeil à quelque chose comme mongo-mock et utilisez-le à la place.

+0

Pour les tests unitaires je suis d'accord avec cette déclaration mais pour mes tests end2end je voudrais accéder à une base de données réelle (au moins pour l'instant) – Gobliins

+0

Btw. afaics ma question s'appliquerait aussi à la mongo-mock db – Gobliins

1

Si vous souhaitez vous connecter à une base de données MongoDB de la manière que vous décrivez, vous pouvez utiliser les promesses JavaScript pour vous assurer que vous avez défini db lorsque vous appelez getCollection. Le code que vous inclure dans votre bloc afterAll serait alors quelque chose comme ce qui suit:

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); 

Notez que j'ai utilisé un peu de syntaxe ES6 par habitude, mais il fonctionne exactement la même chose avec ES5.