首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在快速应用集成测试中使用mockgoose (或任何其他db模拟)

如何在快速应用集成测试中使用mockgoose (或任何其他db模拟)
EN

Stack Overflow用户
提问于 2017-07-14 17:26:44
回答 1查看 5.1K关注 0票数 2

在一个简单的单元测试中使用模型鹅是相当直接的。然而,对于如何在验收或集成测试中使用mockgoose或其他模拟解决方案,我有点模糊。

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

代码语言:javascript
复制
/*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!')
})

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

代码语言:javascript
复制
/*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数据库,并仍然运行像上面所示的集成测试?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 17:07:31

我和你有同样的问题。在我的例子中,我使用柴+柴-http解决了问题,并在不同的文件中断开了db连接和应用程序:

db.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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 (用于测试):

代码语言:javascript
复制
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 (用于开发或生产):

代码语言:javascript
复制
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!

    });
});

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45108649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档