在单独的Mocha测试中测试数据库行

时间:2013-10-21 20:32:04

标签: node.js mocha

Mocha的典型工作流程是:

describe("my test", function(){
  it("should calculate X correctly", function(){...});
  it("should calculate Y correctly", function(){...});
  it("should calculate Z correctly", function(){...});
});

然而,假设我正在从可能有数千条记录的数据库中读取X,Y和Z.我绝对不想以这种方式构建我的测试,否则我会为每个项目阅读每个记录一次:

describe("database test", function(){
  it("should calculate X correctly", function(){
    // check all X in the database
  });
  it("should calculate Y correctly", function(){
    // check all Y in the database
  });
  it("should calculate Z correctly", function(){
    // check all Z in the database
  });
});

考虑到Mocha的格式,看起来这是测试我的数据库同时保留每个测试名称的唯一方法。

还有另一种方法可以测试:(a)正确标记所有测试,(b)要求每条记录只读一次吗?

1 个答案:

答案 0 :(得分:0)

您可以使用before挂钩加载所有记录,然后在每个测试中访问相同的记录列表。

describe("database test", function () {
    var records = [];
    before(function (done) {
        // Load records into the variable "records"
        done();
    });

    it("should calculate X correctly", function () {
        // check all X in the database
    });
});

编辑:您还可以iterate通过每条记录(假设您正在使用jugglingdb或支持它的ORM),而不将所有记录加载到内存中:

describe("database test", function () {
    var someCalculation = 0;

    before(function (done) {
        // Only load 100 records at a time.
        Model.iterate({ batchSize: 100 }, function (singleObject, next, i) {
            // Do whatever you need to calculate x/y/z.
            someCalculation++;
            next();
        }, function (err) {
            // Callback
            done();
        }
    });

    it("should calculate X correctly", function (done) {
        // Validate/test here.
        someCalculation.should.be.above(1);
        done();
    });
});

您可以在每个测试中进行迭代,但由于您只想读取每个记录一次而不将其保留在内存中,因此将其加载到before hook中应该效果最佳。