0

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)要求每条记录只读取一次?

4

1 回答 1

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

编辑:您还可以遍历每条记录(假设您使用的是 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 挂钩中应该效果最好。

于 2013-10-21T21:48:19.367 回答