Mongodb доступ в тесте мокко

1

Поэтому я хотел бы очистить свой 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();

Это возможно?

  • 0
    Вы пытаетесь получить доступ к реальной базе данных?
  • 0
    да mongodb 2.6.7, или как я могу понять ваш вопрос?
Показать ещё 6 комментариев
Теги:
mocha
webdriver-io

2 ответа

1

Если вы хотите подключиться к базе данных 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.

0

Эмпирическое правило состоит в том, что вы всегда издеваетесь над такими вещами, как базы данных или http-запросы в своих тестовых случаях. Посмотрите на что-то вроде mongo-mock и используйте его вместо этого.

  • 0
    Для модульных тестов я согласен с этим утверждением, но для моих тестов end2end я хотел бы получить доступ к реальной базе данных (по крайней мере, на данный момент)
  • 0
    Btw. afaics мой вопрос также относится к dong mongo-mock, а также

Ещё вопросы

Сообщество Overcoder
Наверх
Меню