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

时间:2018-01-09 10:11:23

标签: javascript mocha chai

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

请注意每次我清理数据库并从头开始运行,以便我测试的每个API都是自包含的,而不依赖于其他描述块的结果。

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

以下是我的代码:

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

2 个答案:

答案 0 :(得分:3)

默认情况下,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);
    });
    

答案 1 :(得分:0)

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