Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mocha测试中的Mongodb访问_Javascript_Node.js_Mongodb_Mocha.js_Webdriver Io - Fatal编程技术网

Javascript mocha测试中的Mongodb访问

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

所以我想在单元测试之前或之后清理我的数据库

基本上,您将在我的代码块中看到的代码是在mocha的
块中。我正在使用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