我正在使用mongojs
并使用mocha
为istanbul
运行覆盖率编写测试。我的问题是我想包括测试db错误。
var mongojs = require('mongojs');
var db = mongojs.connect(/* connection string */);
var collection = db.collection('test');
...
rpc.register('calendar.create', function(/*... */) {
collection.update({...}, {...}, function (err, data) {
if (err) {
// this code should be tested
return;
}
// all is good, this is usually covered
});
});
测试看起来像这样
it("should gracefully fail", function (done) {
/* trigger db error by some means here */
invoke("calendar.create", function (err, data) {
if (err) {
// check that the error is what we expect
return done();
}
done(new Error('No expected error in db command.'));
});
});
有一个相当复杂的设置脚本可以设置集成测试环境。当前的解决方案是使用db.close()
断开数据库连接并运行测试,从而导致错误。当此之后的所有其他测试都需要数据库连接失败时,会出现此解决方案的问题,因为我尝试重新连接而没有成功。
关于如何解决这个问题的任何想法?最好不要编写下一版mongojs
可能不会引发的自定义错误。或者有更好的方法来构建测试吗?
答案 0 :(得分:0)
嘲笑处理mongo的图书馆怎么样?
例如,假设db.update
最终是由collection.update
调用的函数,您可能希望执行类似
describe('error handling', function() {
beforeEach(function() {
sinon.stub(db, 'update').yields('error');
});
afterEach(function() {
// db.update will just error for the scope of this test
db.update.restore();
});
it('is handled correctly', function() {
// 1) call your function
// 2) expect that the error is logged, dealt with or
// whatever is appropriate for your domain here
});
});
我使用了Sinon
JavaScript的独立测试间谍,存根和模拟。没有依赖关系,适用于任何单元测试框架。
这有意义吗?