Javascript mocha测试中的Mongodb访问
所以我想在单元测试之前或之后清理我的数据库 基本上,您将在我的代码块中看到的代码是在mocha的Javascript mocha测试中的Mongodb访问,javascript,node.js,mongodb,mocha.js,webdriver-io,Javascript,Node.js,Mongodb,Mocha.js,Webdriver Io,所以我想在单元测试之前或之后清理我的数据库 基本上,您将在我的代码块中看到的代码是在mocha的块中。我正在使用webdriver.io testrunner运行测试 我不明白的是,如何在connect范围之外使用db stuff,请参见: function createConnection(){ MongoClient.connect('mongodb://127.0.0.1:24001/meteor', function(err, db) { if (err) thr
块中。我正在使用webdriver.io testrunner运行测试
我不明白的是,如何在connect范围之外使用db stuff,请参见:
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();
这可能吗?经验法则是,您总是在测试用例中模拟数据库或http请求之类的东西。看看类似的东西,然后改用它。如果您想以您描述的方式连接到MongoDB数据库,可以使用JavaScript承诺确保在调用getCollection
时定义了db
。您将包含在块中的代码如下所示:
函数createConnection(连接){
//还愿
返回新承诺((解决、拒绝)=>{
MongoClient.connect('mongodb://127.0.0.1:24001/meteor,函数(err,db){
如果(错误){
//如果连接失败,则拒绝并出错
拒绝(错误);
}
//如果连接成功,则返回数据库句柄
决议(db);
});
});
}
//函数获取数据库和集合名称的句柄
函数getCollection(db,name){
返回数据库集合(名称);
}
//测试它是否有效
createConnection()。然后((db)=>{
让myCollection=getCollection(db,'foo');
//用一个集合做一些事情
//例如myCollection.deleteOne({foo:1});
// ...
//用另一个收藏做一些东西
myCollection=getCollection(db,'bar');
//例如myCollection.insert({bar:1});
// ...
//确保捕获所有错误并将其记录到控制台
}).catch(控制台错误);
请注意,出于习惯,我使用了一些ES6语法,但它与ES5的工作原理完全相同。您是否正在尝试访问真实的数据库?是的,mongodb 2.6.7,或者我如何理解您的问题?这是个坏主意。您总是为测试模拟数据库。这同样适用于http请求。看看类似的东西,用它代替真实的数据库。@lukaleli我不同意。是否应该模拟数据库或http请求取决于要测试的内容。例如,如果模拟所有http请求,那么性能或负载测试就没有多大意义。如果我的目标是测试一个单元-是的,您模拟数据库和http请求,因为您希望测试独立的单元,并且希望测试运行得非常快,以使它能够在每次构建应用程序时运行。如果我的目标是测试整个系统,那么使用测试数据库就可以了。@Rhayene我完全同意。我以为OP是在谈论单元测试。对于单元测试,我同意这一说法,但对于我的end2end测试,我想访问一个真实的数据库(至少现在是这样)。顺便说一句,afaics我的问题也适用于mongo mock db