内存中的MongoDB进行测试?

时间:2012-11-28 14:44:33

标签: node.js mongodb integration-testing mocha

我正在使用MongoDB数据库为我的NodeJS应用程序编写一些集成和系统测试。我使用的测试框架是Mocha和Supertest。是否可以将MongoDB设置为内存数据库,我可以使用它来测试,然后在测试完成后擦除所有的集合和文档?

2 个答案:

答案 0 :(得分:9)

您可以使用mongodb-memory-server完成此操作。该软件包将mongod二进制文件下载到您的主目录,并根据需要实例化一个新的支持内存的MondoDB实例。对于每个测试文件,您可以启动一个新服务器,这意味着您可以并行运行它们。


对于使用jestnative mongodb driver的读者,您可能会发现此类很有用:

const { MongoClient } = require('mongodb');
const { MongoMemoryServer } = require('mongodb-memory-server');

// Extend the default timeout so MongoDB binaries can download
jest.setTimeout(60000);

// List your collection names here
const COLLECTIONS = [];

class DBManager {
  constructor() {
    this.db = null;
    this.server = new MongoMemoryServer();
    this.connection = null;
  }

  async start() {
    const url = await this.server.getConnectionString();
    this.connection = await MongoClient.connect(url, { useNewUrlParser: true });
    this.db = this.connection.db(await this.server.getDbName());
  }

  stop() {
    this.connection.close();
    return this.server.stop();
  }

  cleanup() {
    return Promise.all(COLLECTIONS.map(c => this.db.collection(c).remove({})));
  }
}

module.exports = DBManager;

然后在每个测试文件中,您可以执行以下操作:

const dbman = new DBManager();

afterAll(() => dbman.stop());
beforeAll(() => dbman.start());
afterEach(() => dbman.cleanup());

我怀疑这种方法可能与其他测试框架相似。

答案 1 :(得分:0)

我建议使用mongodb-memory-server。

我有一个在整个项目中共享的数据库文件,因此我也必须对其进行测试。

//db.js

import mongoose from 'mongoose';
import bluebird from 'bluebird';

module.exports = {
  mongoose,
  init: () => {
      mongoose.Promise = bluebird;
  },
  connect: async database => {
      try {
          const conn =  await mongoose.connect(
              database,
              { useNewUrlParser: true }
          );

          //eslint-disable-next-line
          console.log(`MongoDb Connected on: ${database}`);

          return conn;
      } catch (err) {
          //eslint-disable-next-line
          console.log('Error to connect on mongo', err);
      }
  },
  disconnect: async () => await mongoose.connection.close()
};

已在测试中使用(db.js),我创建了一个test-helper.js文件。

'use strict';
import MongodbMemoryServer from 'mongodb-memory-server';
import db from '../src/db';

const server = new MongodbMemoryServer();

const createDB = async () => {
    try {
       const url = await server.getConnectionString();
       db.connect(url);
    } catch (err) {
      throw err;
    }
 };

 const destroyDB = () => {
   db.disconnect();

 };

 module.exports = {
    createDB,
    destroyDB
 }; 
}

因此,我的测试始终在创建和销毁de DB之前和之后,例如:

import { createDB, destroyDB } from '../test-helper';
before(() => {
  createDB();
});
after(() => {
  destroyDB();
});

希望这会有所帮助。

我正在使用的项目:https://github.com/abdalla/node-auth