mongodb - 如何在快速应用程序集成测试中使用 mockgoose(或任何其他数据库模拟)

标签 mongodb express testing integration-testing mockgoose

在简单的单元测试中使用 mockgoose 非常简单。但是,对于如何在验收或集成测试中使用 mockgoose 或其他模拟解决方案,我有点模糊。

给定一个简单的 express/MongoDB 应用程序,如下所示:

/*app.js*/

const express = require('express')
const app = express()
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var greetingSchema = mongoose.Schema({
    greeting: String
});

var Greeting = mongoose.model('Greeting', greetingSchema);

app.get('/', function (req, res) {
  Greeting.find({greeting: 'Hello World!'}, function (err, greeting){
    res.send(greeting);
  });  
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

和这样一个简单的集成测试:

/*test.js*/

const app = require('app.js');  
const request = require('supertest');

it('sends "Hello World!" on the response body', (done) => {  
  request(app)
      .get('/')
      .expect(200, 'Hello World!', done);
  });
});

通过在请求中使用实际的应用程序,我们连接到应用程序的数据库('mongodb://localhost/test')。那么如何使用 mockgoose 或任何其他解决方案来模拟 MongoDB 数据库并仍然运行如上所示的集成测试?

最佳答案

我遇到了和你一样的问题。就我而言,我解决了使用 chai + chai-http并断开不同文件中的数据库连接和应用程序:

db.js:

const mongoose = require('mongoose');
const config = require('../../config');
mongoose.Promise = global.Promise;
mongoose.set('debug', process.env.DEBUG != undefined);

function open(){
    return new Promise((resolve, reject) => {
        if(process.env.DEBUG != undefined) {
            let Mockgoose = require('mockgoose').Mockgoose;
            let mockgoose = new Mockgoose(mongoose);
            mockgoose.helper.setDbVersion("** your mongodb version **");
            mockgoose.prepareStorage().then(function() {
                mongoose.connect(config.db_test, (err, res) => {
                  if (err) return reject(err);
                  resolve();
                });
            }).catch(reject);
        }else{
            mongoose.connect(config.db, (err, res) => {
              if (err) return reject(err);
              resolve();
            });
        }
    });
}

function close(){
    return mongoose.disconnect();
}

module.exports = { close, open };

app.js:

const express = require('express');

const bodyParser = require('body-parser');
const api = require('./routes');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use('/api', api);

module.exports = app;

test.js(用于测试):

const chai = require('chai');
const chaiHttp = require('chai-http');
const expect = chai.expect;
const conn = require('./../utils/db'); // <-- db.js
const app = require('../../app'); // <-- app.js

chai.use(chaiHttp);

describe('# Test', function(){

    before(function(done) {
        conn.open().then(() => done()).catch(done);
    });

    after(function(done){
        conn.close().then(() => done()).catch(done);
    });

    it(`test something`, function(done){

        chai.request(app) // <-- pass the app here
            .get('/path/to/test')
            .then((res) => {
                // expects

                done();
              })
              .catch((err) => {
                  done(err);
              });
    });
});

index.js(用于开发或生产):

const conn = require('./utils/db'); // <-- db.js
const app = require('./app'); // <-- app.js
const config = require('./config'); 

conn.open().then(() => {
    app.listen(config.port, () => {

        // OK!

    });
});

我希望它对你或任何人有用。

关于mongodb - 如何在快速应用程序集成测试中使用 mockgoose(或任何其他数据库模拟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108649/

相关文章:

mysql - 如何以 React 形式管理来自 Express 的 mysql 查询错误?

node.js - 检查用户身份验证

reactjs - 模拟 React useRef 或带有 enzyme 和 Jest 的功能组件内的函数?

python - Mongoengine - 命令查找需要身份验证

javascript - 自定义 MongoDB 查询以返回特定的子文档

node.js - 如何在jade中动态添加多个类名?

unit-testing - 通过 maven-surefire-plugin 测试我的项目时遇到问题

Android - 测试谷歌地图信息窗口点击

javascript - Node JS : Login not working

mongodb - MongoDB与Elasticsearch过滤