【问题标题】:Best practice for decoupling queries from testing将查询与测试分离的最佳实践
【发布时间】:2014-02-10 06:49:36
【问题描述】:

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

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

测试此类函数的最佳实践是什么?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    在单元测试方面,因为这个方法是一个调用外部模块的封装器,所以将单元测试推迟到第三方可能就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 2020-02-05
      • 2013-05-10
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多