使用mongojs进行集成测试以涵盖数据库错误

时间:2015-03-18 11:31:30

标签: node.js testing mocha mongojs

我正在使用mongojs并使用mochaistanbul运行覆盖率编写测试。我的问题是我想包括测试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可能不会引发的自定义错误。或者有更好的方法来构建测试吗?

1 个答案:

答案 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的独立测试间谍,存根和模拟。没有依赖关系,适用于任何单元测试框架。

这有意义吗?