2013-09-05 62 views
5

Tôi đang sử dụng node.js/express với https://github.com/dresende/node-orm2 để sử dụng cơ sở dữ liệu MySQL của tôi.Làm thế nào để bạn giả lập MySQL (với nút-hoặcm2) trong Node.js/Express?

Tôi mới vào thế giới node.js và tôi khá mắc kẹt cho đến nay, tôi không biết làm thế nào để kiểm tra đơn vị (không tích hợp kiểm tra) một chức năng đơn giản.

Đây là server.js của tôi, tải mô hình của tôi sử dụng (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...'); 

đây là mô hình sử dụng:

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(); 
}; 

và đây là phương pháp của tôi để tìm bạn bè tích cực trong bạn bè. js:

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

Tôi muốn biết làm cách nào để viết một bài kiểm tra đơn giản (với mocha và sinon.js?) bằng cách mô phỏng ing kết nối cơ sở dữ liệu và yêu cầu cũng có. Tôi cần phải giả định giá trị của req.currentUser mà người dùng trả về bởi ORM trong phần mềm trung gian.

Tôi chỉ muốn chạy thử nghiệm đơn vị và không sử dụng DB thực hoặc thực hiện một số cuộc gọi HTTP.

cảm ơn sự giúp đỡ của bạn.

Trả lời

0

Nếu bạn muốn giả lập req sử dụng sinon.js, bạn có thể làm điều gì đó như sau.

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

Bằng cách này bạn không nên kết nối với mô hình chỉ kiểm tra friend.js.

Ngoài ra, vì tôi vừa mới nhận thấy bạn đang sử dụng orm.express, bạn cũng có thể chỉ cần giả lập req.models với chức năng được liệt kê mà bạn mong muốn như trên.