2017-07-14 3 views
0

L'utilisation de mockgoose dans un test unitaire simple est assez simple. Cependant, je suis un peu flou quant à la façon d'utiliser mockgoose ou d'autres solutions moqueuses dans un test d'acceptation ou d'intégration.Comment utiliser mockgoose (ou tout autre moqueur) dans le test d'intégration d'application express

Compte tenu d'un simple express/app MongoDB comme ce qui suit:

/*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!') 
}) 

et un simple test d'intégration comme ceci:

/*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); 
    }); 
}); 

En utilisant l'application réelle de la demande, nous connectons à la base de données de l'application ('mongodb: // localhost/test'). Comment peut-on alors utiliser mockgoose, ou toute autre solution, pour se moquer de la base de données MongoDB et lancer un test d'intégration comme celui présenté ci-dessus?

Répondre

5

J'ai eu le même problème que vous. Dans mon cas, je résolus à l'aide chai + chai-http et de briser la connexion db et application dans différents fichiers:

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 (pour test):

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 (pour le développement ou la production):

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! 

    }); 
}); 

J'espère que cela fonctionne pour vous ou quelqu'un.

+0

Génial. Je me demandais juste, vous ne semblez pas avoir une connexion de base de données dans votre fichier app.js. Ne devriez-vous pas appeler db.open() depuis le fichier app.js? – neoflash

+1

@neoflash J'ai un index.js avec 'conn.Open()' et 'app.listen' après la connexion db est ok;) – lmfresneda

+0

@Imfresneda voulez-vous bien ajouter vos index.js à votre réponse? – neoflash