2013-09-05 2 views
5

Sto usando node.js/express con https://github.com/dresende/node-orm2 per utilizzare il mio database MySQL.Come si prende in giro MySQL (con node-orm2) in Node.js/Express?

Sono nuovo nel mondo node.js e sono abbastanza bloccato finora, non so come test di unità (non test di integrazione) una funzione semplice.

Ecco il mio server.js, caricando il mio modello utente (ORM)

var express = require('express'), 
    orm = require('orm'), 
    config = require('./config/config.js'), 
    auth = require('./services/authentication'), 
    helper = require('./middlewares/helper.js'), 
    friends = require('./modules/friends.js'); 

var app = express(); 

app.use(orm.express('mysql://' + config.mysql.username + ':' + config.mysql.pwd + '@' + config.mysql.host + ':' + config.mysql.port + '/' + config.mysql.db, { 
    define: function(db, models, next) { 
     db.load("./models/models.js", function(err) { // loaded! 
      models.user = db.models.user; 
     }); 
    } 
})); 

var middlewares = [auth.authenticate, helper.retrieveUser]; 

app.get('/friends', middlewares, friends.findActiveFriends); 

app.listen(3000); 
console.log('Listening on port 3000...'); 

qui è il modello di utente:

module.exports = function (db, cb) { 
    var User = db.define('user', { 
     uid    : { type: 'number', rational: false, unique: true, required: true }, 
     first_name  : { type: 'text', size: 100, required: true }, 
     last_name   : { type: 'text', size: 100, required: true }, 
     picture   : { type: 'text', size: 255, required: false }, 
     email    : { type: 'text', size: 255, required: true }, 
     creation_date  : { type: 'date', time: true }, 
     modification_date : { type: 'date', time: true } 
    }, { 
     methods: { 
      fullName: function() { 
       return this.first_name + ' ' + this.last_name; 
      } 
     }, 
     hooks: { 
      beforeCreate: function (next) { 
       if (this.creation_date == undefined) { 
        this.creation_date = new Date(); 
       } 
       if (this.modification_date == undefined) { 
        this.modification_date = new Date(); 
       } 
       return next(); 
      } 
     } 
    }); 

    // CUSTOM FUNCTIONS 
    User.getByUid = function(uid, callback) { 
     this.find({ uid: uid }, function(err, users) { 
      if(err) callback(err); 
      if (users.length == 1) { 
       callback(null, users[0]); 
      } else { 
       callback('No user found with uid=' + uid); 
      } 
     }); 
    }; 

    User.hasMany("friends", User, { 
     status: { type: 'enum', values: ['pending', 'refused', 'active'] } 
    }, { 
     reverse: 'friendsrev', mergeId: 'user_id', mergeAssocId: 'friend_id' 
    }); 

    return cb(); 
}; 

ed ecco i miei metodi per trovare amici attivi in ​​amici. JS:

var _findActiveFriends = function(req, res) { 
    req.currentUser.getFriends({ 
     status: 'active' 
    }, function(err, friends) { 
     if (err) throw err; 
     res.send(JSON.stringify(friends)); 
    }); 
}; 

vorrei sapere come posso scrivere un semplice test (con la moka e sinon.js?) per finta anche la connessione al database e la richiesta. Ho bisogno di prendere in giro il valore di req.currentUser che è un utente restituito dall'ORM in un middleware.

Voglio solo eseguire i test unitari e non utilizzare un DB reale o effettuare alcune chiamate HTTP.

grazie per il vostro aiuto.

risposta

0

Se si desidera prendere in giro il req utilizzando sinon.js, è possibile fare qualcosa di simile al seguente.

var sinon = require('sinon'); 
var friend = require('./friend'); 

it('some test', function(done) { 
    var req = { 
    currentUser: { 
     // Add all the properties/functions that you are concerned with here. 
     // and you can/should wrap them around sinon.spy(). 
     // If you are not concerned with that function (i.e. you are not using it) 
     // then you can simply use sinon.stub() to return a stub function. 
    } 
    }; 
    var res = { 
    send: sinon.spy(function(obj) { 
     assert.ok(obj); // yes object exists 
     done(); // end of test 
    }; 
    }; 
    var next = function() {}; 
    friend.findActiveFriend(req, res, next); 
}); 

In questo modo non si dovrebbe collegare al modello, che mette alla prova solo friend.js.

Inoltre, dal momento che ho appena notato che si sta utilizzando orm.express, si potrebbe anche voler prendere in giro semplicemente req.models con la funzione stubbed desiderato come sopra.