如何 运行 在 mocha-chai 测试套件中按顺序描述两个块

How to run two describe blocks sequentially in a mocha-chai test suite

在我的一个 mocha-chai 测试中,我有两个描述块。在每个描述块中,我至少有两个 'it' 块。第二个 describe 块重复第一个 describe 块所做的类似事情以及一些额外的事情。当我给出 运行 时,我觉得两个描述块一个接一个地同时开始,导致测试用例失败。如果我 运行 通过注释掉其中一个描述块来单独 运行 他们 运行 很好。

请注意,每次我清除数据库并从头开始给出 运行 时,我测试的每个 API 都是独立的,不依赖于其他描述的结果块。

我如何对它们进行排序,以便第二个描述块在第一个之后 运行s,如果我有两个以上的描述块,依此类推。

下面是我的代码:

var server;
var mongodb;

before(function (done) {
    server = require('../../../app.js'); // same as "node app.js"
    done();
})

after(function (done) {
    server.close();
})

beforeEach(function (done){
    clear_the_db();
    done();
})

var json_obj = {"a":"b"};
function clear_the_db() {
    var mongoObj = mongoose.model('modelname');
    mongoObj.remove({}, function(err){
    if(!err) {
        console.log('MongoDb collections removed');
    } else {
        console.log('Error is= '+err);
    }
})

describe('First:POST call to insert data into project', ()=> {
    clear_the_db();
    it('First:Creating project', (done) => {
        chai.request(server)
        .post('/create/myproject')
        .send()
        .end((err, res) => {
            expect(res.statusCode).to.equal(200);
            done();
        });
    });

    it('First:Inserting data into created project', (done) => {
        chai.request(server)
        .post('/data/myproject')
        .send(json_obj)
        .end((err, res) => {
            expect(res.statusCode).to.equal(200);
            done();
        });
    });

});
describe('Second:POST call to insert data into project', ()=> {
    clear_the_db();
    it('Second:Creating project', (done) => {
        chai.request(server)
        .post('/create/myproject')
        .send()
        .end((err, res) => {
            expect(res.statusCode).to.equal(200);
            done();
        });
    });

    it('Second:Inserting data into created project', (done) => {
        chai.request(server)
        .post('/data/myproject')
        .send(json_obj)
        .end((err, res) => {
            expect(res.statusCode).to.equal(200);
            done();
        });
    });

    it('Second:Fetching data from the created project', (done) => {
        chai.request(server)
        .get('/data/myproject')     
        .end((err, res) => {
            expect(res.statusCode).to.equal(200);
            done();
        });
    });
});

https://mochajs.org/ 读取钩子后更新了代码:

var server;
var mongodb;

before(function (done) {
    server = require('../../../app.js'); // same as "node app.js"
    done();
})

after(function (done) {
    server.close();
})


var json_obj = {"a":"b"};
function clear_the_db() {
    var mongoObj = mongoose.model('modelname');
    mongoObj.remove({}, function(err){
        if(!err) {
            console.log('MongoDb collections removed');
        } else {
            console.log('Error is= '+err);
        }
    })
}

describe("This is outer-most describe", function() { 
    beforeEach(function (done){
        clear_the_db();
    })

    describe('First:POST call to insert data into project', ()=> {
        it('First:Creating project', (done) => {
            chai.request(server)
            .post('/create/myproject')
            .send()
            .end((err, res) => {
                 expect(res.statusCode).to.equal(200);
                 chai.request(server)
                .post('/data/myproject')
                .send(json_obj)
                .end((err, res) => {
                    expect(res.statusCode).to.equal(200);
                });
                done();
            });
        });         
    });

    describe('Second:POST call to insert data into project', ()=> {
        it('Second:Creating project', (done) => {
            chai.request(server)
            .post('/create/myproject')
            .send()
            .end((err, res) => {
                expect(res.statusCode).to.equal(200);
                chai.request(server)
                .post('/data/myproject')
                .send(json_obj)
                .end((err, res) => {
                     expect(res.statusCode).to.equal(200);
                     chai.request(server)
                     .get('/data/myproject')        
                     .end((err, res) => {
                         expect(res.statusCode).to.equal(200);
                     });
                });
                done();
            });
        });         
    });
}); 

Mocha 默认按顺序测试 运行。您必须在其他地方寻找问题。

可能的原因:

  1. 你们的两个套房同名-POST call to insert data into project.
  2. 如果clear_the_db();是异步的,不保证在运行宁it()块之前完成执行。相反,您应该在 beforeEach 挂钩回调中进行清理,并在任务完成后继续下一个测试用例。示例:

    function clear_the_db(doneCb) {
      var mongoObj = mongoose.model('modelname');
    
      mongoObj.remove({}, function(err){
        if(!err) {
          console.log('MongoDb collections removed');
        } else {
          console.log('Error is= '+err);
        }
        // call the Mocha done() callback function 
        doneCb();
      });
    }
    
    // in your beforeEach hook, pass 'done' to 'clear_the_db'
    beforeEach(function (done){
      clear_the_db(done);
    });
    

使用 Visual Studio 2017,当我在同一个 js 测试文件上有多个描述时,我遇到了类似的问题。在同一组测试中,它们有时会失败,具体取决于我是 运行 项目下的所有测试,运行 所有正在调试的测试,只是文件测试,还是只有一个测试。我尝试了各种不同的方法来解决这种情况。我正要放弃,但后来决定在 Visual Studio 之外 运行 它并从命令行 运行 它。瞧!!!成功了!!!