2015-06-17 9 views
5

Mi sto distruggendo nel cervello cercando di capire come gestire la mia connessione MongoDB per i miei test di unità. Mi chiedo quale sia il metodo corretto per farlo poiché il mio layout dell'applicazione potrebbe essere il problema. Questo è per un progetto più ampio con molti moduli.Mocking connessione MongoDB per test delle unità applicative MEAN

Il layout generale modelli

package.json 
server.js 
-models 
    -index.js 
    -users.js 
    -events.js 
    -... 
-services 
    -index.js 
    -userActivity.js 
    -... 
+public 
+routes 
+util 
+test 

/users.js

"use strict"; 
modules.export = function(mongoose) { 
    var Schema = mongoose.Schema; 
    var userSchema = new Schema({ name: String }); 
    var userModel = mongoose.model('User', userSchema); 
    var userDAO {}; 

    userDAO.addUser(user) { 
    var newUser = new userModel(user); 
    return newUser.save(); 
    } 

    userDAO.getUser(id) { 
    return userModel.findById(id).lean().exec(); 
    } 

    return userDAO; 
}; 

modelli/index.js

"use strict"; 
var bluebird= require('bluebird'); 
var mongoose = bluebird.promisifyAll(require('mongoose')); 

var Users = require ('./users'); 
var Events = require('./events'); 

module.exports.Users = new Users(mongoose); 
module.exports.Events = new Events(mongoose); 

servizi/userActivity.js

"use strict"; 
var db = require('../models'); 

module.exports = function(userID) { 
    return db.Events.getEventsForUser(userId) 
}; 

Ora qui è dove il problema è

test/test.js

"use strict"; 
var chai = require('chai'); 
chai.use(require('chai-as-promised'); 
var expect = chai.expect; 

var mongoose = require('mongoose'); 
mongoose.connect("mongodb://localhost/testDB") 

var db = require('../models'); 
var services = require('../services') 

describe("sample tests", function() { 
    var user1, user2; 
    var user1TestEvents = [];  

    before(function(done) { 
    db.Users.addUser({name:"John"}). 
    then(function(john) { 
     user1 = john; 
     return db.Users.addUser({name: "Mary"}); 
    }). 
    then(function(mary) { 
     user2 = mary; 
     return db.Events.addEvent{user: user1._id, event: "logged in", time: new Date()}); 
    }). 
    then(function(event) { 
    user1TestEvents.push(event); 
    done() 
    }); 
    }; 

    it('gets a users events', function() { 
    var events = services.getEventsForUser(user1._id); 
    return expect(events).eventually.to.have.length(user1TestEvents.length); 
    }); 

I test funzionano bene se mi connetto a un database dal vivo sulla mia macchina, ma i nostri server CI non avrà un database mongo in esecuzione su di loro. Ho cercato di capire un modo per simulare la connessione, ma non ho trovato nessuna valida alternativa

Ho cercato di usare Mockgoose per ottenere il database del mock ma a meno che non passi l'oggetto mangusta mockgooes fino in fondo attraverso tutti i componenti non funzionerà.

var mockgoose = require('mockgoose'); 
var mongoose = require('mongoose'); 
mockgoose(mongoose); 

mongoose.connect("mongodb://localhost/test"); 

Quando ho provato questo, dopo la prima promessa si risolve nei miei "prima", tutte le promesse successive non risolvono e tempi di moka fuori.

Non sono riuscito a far funzionare tingoDB e mi sento come se mi mancasse qualcosa di ovvio.

Tutti gli esempi che ho visto sono stati casi di test molto semplici in cui i modelli sono stati creati nella stessa posizione in cui l'oggetto mangusta ha eseguito la connessione e con il modo in cui ho rotto l'applicazione non riesco a ottenere un disaccoppiamento da mangusta all'attuale istanza MongoDB.

Se qualcuno ha esperienza con le applicazioni MEAN di testing unitario senza un'istanza MongoDB effettiva, sarei molto felice per alcuni consigli su come risolvere il mio layout e far funzionare i miei test unitari.

+0

Sembra che ci siano un sacco di quadri di derisione della mangusta. Li hai esaminati? –

+0

Mockgoose sembra adattarsi a quello che voglio essere in grado di fare il meglio, ma non riesco a far funzionare quello senza passare l'oggetto di mangusta deriso attraverso tutti gli oggetti che intervengono. mongoose-mock Penso che aggiunga solo stub sinon.js tingoDB Sto avendo problemi anche io, dove il guidatore di mangusta, tungus sembrava lanciare degli errori. – Ilvenis

+1

https://www.npmjs.com/package/mongoose-mock che sembra più vicino. Devi solo passare tutti i tuoi modelli attraverso: User = proxyquire ('../../../ model/User', {'mongoose': mongooseMock}); –

risposta

1

È possibile utilizzare rewire per simulare qualsiasi modulo richiesto. E ridefinendo il metodo che ti serve.

Problemi correlati