我正在寻找使用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');
})
})
测试此类功能的最佳做法是什么?
由于
答案 0 :(得分:0)
与数据库的实际交互不应通过单元测试来处理,而应通过端到端测试来处理。使用数据库进行端到端测试的最佳实践是定义一个数据库状态,该状态将在每次测试之前加载到数据库中。
就单元测试而言,由于此方法是调用外部模块的包装器,因此可能足以将单元测试推迟到第三方。