如何 运行 在 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 默认按顺序测试 运行。您必须在其他地方寻找问题。
可能的原因:
- 你们的两个套房同名-
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);
});
使用 Visual Studio 2017,当我在同一个 js 测试文件上有多个描述时,我遇到了类似的问题。在同一组测试中,它们有时会失败,具体取决于我是 运行 项目下的所有测试,运行 所有正在调试的测试,只是文件测试,还是只有一个测试。我尝试了各种不同的方法来解决这种情况。我正要放弃,但后来决定在 Visual Studio 之外 运行 它并从命令行 运行 它。瞧!!!成功了!!!
在我的一个 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 默认按顺序测试 运行。您必须在其他地方寻找问题。
可能的原因:
- 你们的两个套房同名-
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); });
使用 Visual Studio 2017,当我在同一个 js 测试文件上有多个描述时,我遇到了类似的问题。在同一组测试中,它们有时会失败,具体取决于我是 运行 项目下的所有测试,运行 所有正在调试的测试,只是文件测试,还是只有一个测试。我尝试了各种不同的方法来解决这种情况。我正要放弃,但后来决定在 Visual Studio 之外 运行 它并从命令行 运行 它。瞧!!!成功了!!!