在我的一个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();
});
});
});
});
答案 0 :(得分:3)
默认情况下,Mocha测试会间歇性地运行。你必须在其他地方寻找问题。
可能的原因:
POST call to insert data into project
。如果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外部运行它,并从命令行运行它。哎呀!它起作用了!