将查询与测试分离的最佳实践

时间:2014-02-10 06:49:37

标签: mysql node.js mocha sinon should.js

我正在寻找使用mocha或sinon测试mysql查询的最佳实践。我正在尝试测试非常基本的数据库查询,例如save:

User.prototype.save = function(cb) {

var query = 'INSERT INTO user (name, email, password, img, description)' 
    + 'values (?, ?, ?, ?, ?)';

var params = [this.name, this.email, this.pass, this.img, this.description];

db.query(query, 
    params,
    function(err, rows) {
        if (err) return cb(err);
        cb(rows.insertId);
    }
);
};

我相信我想模拟数据库并使用该对象而不是我的db对象,但我还想将测试逻辑与应用程序逻辑分开。

我尝试了

的变化
describe('User', function() {
before(function() {
    mock = sinon.mock(require('../middleware/db'));
})
describe('.save()', function() {
    var uid;
    it('should run save on a user', function() {
        var user = new User ({
            name: 'Test Case 1',
            email: 't1@example.com',
            pass: 'pass',
            img: 'path/to/img.jpg'
        });
        user.save(function(id) {
            id.should.be.ok;
            var uid = id;
        });
    })
    it('should save the user', function() {
        var ret = User.find(uid);
        ret.should.be.ok;
        ret.should.have.property('description');
        ret.name.should.equal('Test Case 1');
        ret.email.should.equal('t1@example.com');
    })
 })

测试此类功能的最佳做法是什么?

由于

1 个答案:

答案 0 :(得分:0)

与数据库的实际交互不应通过单元测试来处理,而应通过端到端测试来处理。使用数据库进行端到端测试的最佳实践是定义一个数据库状态,该状态将在每次测试之前加载到数据库中。

就单元测试而言,由于此方法是调用外部模块的包装器,因此可能足以将单元测试推迟到第三方。