【问题标题】:Mongodb access in mocha test摩卡测试中的MongoDB访问
【发布时间】:2017-09-21 12:43:12
【问题描述】:

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

基本上,您将在我的代码块中看到的代码位于 mocha 的 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 2.6.7,或者我怎么能理解你的问题?
  • 这是个坏主意。你总是为你的测试模拟数据库。这同样适用于 http 请求。看看github.com/williamkapke/mongo-mock 之类的东西,用它代替真正的数据库。
  • @lukaleli 我不同意。如果您应该模拟数据库或 http 请求,则取决于您要测试的内容。例如,如果您模拟所有 http 请求,性能或负载测试就没有多大意义。如果我的目标是测试一个单元 - 是的,您模拟数据库和 http 请求,因为您想测试隔离的单元并希望测试运行得非常快,以使其能够在每次构建应用程序时运行。如果我的目标是测试整个系统,那么使用测试数据库就可以了。
  • @Rhayene 我完全同意。我以为 OP 是在谈论单元测试。

标签: javascript node.js mongodb mocha.js webdriver-io


【解决方案1】:

如果您想以您描述的方式连接到 MongoDB 数据库,您可以使用 JavaScript 承诺确保您在调用 getCollection 时定义了 db。您将包含在 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 完全相同。

【讨论】:

    【解决方案2】:

    经验法则是,您总是在测试用例中模拟数据库或 http 请求等内容。看看mongo-mock 之类的东西,然后改用它。

    【讨论】:

    • 对于单元测试,我同意这个说法,但对于我的端到端测试,我想访问一个真实的数据库(至少现在是这样)
    • 顺便说一句。我的问题也适用于 mongo-mock db
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多