MongoDB 连接期间 Mocha 超时
Mocha timeouts during MongoDB connection
Mongo新手看这里。我正在尝试使用 Mocha、Chai 连接单元测试我的 mongo 数据库集合。但是每次我运行测试,连接好像超时了。我已将 mocha.opts
中的 timeout
增加到 50K 毫秒,但连接似乎仍然超时。我无法得到原因?
这是我的代码
use strict';
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const chai = require('chai');
const expect = chai.expect;
/**
*
* Create a new schema that accepts a firstname and lastname and employee id
*/
const testSchema = new Schema({
firstname : {type: String,required:true},
lastname : {type: String, required:true},
id : {type : Number, required : true}
});
/**
*
* Create a new collection name employee_details
*/
const employee_details = mongoose.model('employee_details',testSchema);
describe('Create a connection with the database',()=>{
before((done)=>{
mongoose.connect('mongodb://127.0.0.1:27017/new_demo');
//I tried changing the url to mongodb://localhost/new_demo but it didn't work
const db = mongoose.connection;
db.on('error',console.error.bind(console,'Error connecting to DB'));
db.once('open',()=>{
console.log('Connected to new_demo db');
done();
});
});
});
describe('Test Database function',()=>{
//Save something with value Mike Stevens, 19981
it('saves a new record',(done)=>{
var first_record = employee_details({
firstname : 'Mike',
lastname : 'Stevens',
id : 19981
});
first_record.save(done);
});
after((done)=>{
mongoose.connection.db.dropDatabase(()=>{
mongoose.connection.close(done);
});
});
});
到目前为止我已经尝试过的事情
- 增加了 mocha 的超时时间
- 已将连接 url 更改为
mongodb://localhost/new_demo
和 mongodb://localhost:27017/new_demo
- 在 shell 中开始
mongod
然后尝试 运行 进行 mocha 测试
错误信息是
Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/ab/ab/abcd/api-testing/mongo-testing/my-mongo-tests/test/create_connection.js)
根据错误消息,应该调用 done
,这是在代码中完成的。那为什么会出现这个错误?
编辑 1:完整错误消息
Test Database function
1) saves a new record
2) "after all" hook
0 passing (50s)
2 failing
1) Test Database function
saves a new record:
Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/ab/ab/abcd/api-testing/mongo-testing/my-mongo-tests/test/create_connection.js)
2) Test Database function
"after all" hook:
TypeError: Cannot read property 'dropDatabase' of undefined
at Context.after (test/create_connection.js:56:34)
mocha测试用例与普通的JS代码没有区别,因此会遵循JS代码的作用域隔离和流程。我试图修复测试用例以允许在各种测试用例和 before/after 挂钩中进行变量访问。
请注意,我没有执行实际的测试用例,您可能需要修改下面的代码才能使运行成功为您
'use strict';
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const chai = require('chai');
const expect = chai.expect;
/**
*
* Create a new schema that accepts a firstname and lastname and employee id
*/
const testSchema = new Schema({
firstname: { type: String, required: true },
lastname: { type: String, required: true },
id: { type: Number, required: true }
});
/**
*
* Create a new collection name employee_details
*/
const employee_details = mongoose.model('employee_details', testSchema);
/**
* Decalre the db const in this(global) context so this variable is visible by all test cases
*/
const db;
// describe('Create a connection with the database', () => {
// // Seems redundet to something
// // Also the context is lost if you do this ..
// // Thus not allowing for you to use variables .. const db in this case
// // If you still want this describe, you will have to use it like any other javascript function ... to expose the variables
// });
describe('Test Database function', () => {
// connect to database
before((done) => {
mongoose.connect('mongodb://127.0.0.1:27017/new_demo');
//Keep the url same which you use to debug you local application
db = mongoose.connection;
db.on('error', console.error.bind(console, 'Error connecting to DB'));
db.once('open', () => {
console.log('Connected to new_demo db');
done();
});
});
//Save something with value Mike Stevens, 19981
it('saves a new record', (done) => {
// Also if you want to increase the deafult timeout of a teast case
// you will have to change the => to function(), because of the way 'this' context behaves
// Thus :
// it('saves a new record', function(done) {
// this.timeout(10000);
// .. test case code
// }
var first_record = employee_details({
firstname: 'Mike',
lastname: 'Stevens',
id: 19981
});
first_record.save(function(err) {
if (err) return handleError(err);
// saved!
done();
//I used a simple callback function instead, makes life easier and code understable
})
});
after((done) => {
mongoose.connection.db.dropDatabase(() => {
mongoose.connection.close(done);
// I am guessing same goes here ..
// keep it simple !!
});
});
});
现在一些理论,理想情况下,不推荐或更确切地说不在单元测试用例的范围中以实际连接到数据库and/or 以任何方式修改外部实体的状态(因为你特别提到'it is a unit test case')。
单元测试应避免进行外部调用或调用实际的 API。我们应该存根调用,并在我们的测试用例中断言调用是在我们预期的时候进行的,或者是在提供了适当的输入时进行的。
这是一个言出必行的例子:
//This is myGLobalServiceLoactor which is used in actual code which is to be tested.
myGLobalServiceLoactor = {
database: {
save: sinon.stub(),
find: sinon.stub()
}
}
it('to check if external method is called ', () => {
let person_to_Save = {
//. . .
//. . .
}
proxyPersonInterface.savePerson(input_person).then((status) => {
// check if our stubbeb function is called
assert(myGLobalServiceLoactor.database.save.calledOnce);
});
});
并且您可以使用像 Sinon and rewire 这样的辅助库来存根和代理单元测试用例中的实际模块。
希望对您有所帮助。
Mongo新手看这里。我正在尝试使用 Mocha、Chai 连接单元测试我的 mongo 数据库集合。但是每次我运行测试,连接好像超时了。我已将 mocha.opts
中的 timeout
增加到 50K 毫秒,但连接似乎仍然超时。我无法得到原因?
这是我的代码
use strict';
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const chai = require('chai');
const expect = chai.expect;
/**
*
* Create a new schema that accepts a firstname and lastname and employee id
*/
const testSchema = new Schema({
firstname : {type: String,required:true},
lastname : {type: String, required:true},
id : {type : Number, required : true}
});
/**
*
* Create a new collection name employee_details
*/
const employee_details = mongoose.model('employee_details',testSchema);
describe('Create a connection with the database',()=>{
before((done)=>{
mongoose.connect('mongodb://127.0.0.1:27017/new_demo');
//I tried changing the url to mongodb://localhost/new_demo but it didn't work
const db = mongoose.connection;
db.on('error',console.error.bind(console,'Error connecting to DB'));
db.once('open',()=>{
console.log('Connected to new_demo db');
done();
});
});
});
describe('Test Database function',()=>{
//Save something with value Mike Stevens, 19981
it('saves a new record',(done)=>{
var first_record = employee_details({
firstname : 'Mike',
lastname : 'Stevens',
id : 19981
});
first_record.save(done);
});
after((done)=>{
mongoose.connection.db.dropDatabase(()=>{
mongoose.connection.close(done);
});
});
});
到目前为止我已经尝试过的事情
- 增加了 mocha 的超时时间
- 已将连接 url 更改为
mongodb://localhost/new_demo
和mongodb://localhost:27017/new_demo
- 在 shell 中开始
mongod
然后尝试 运行 进行 mocha 测试
错误信息是
Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/ab/ab/abcd/api-testing/mongo-testing/my-mongo-tests/test/create_connection.js)
根据错误消息,应该调用 done
,这是在代码中完成的。那为什么会出现这个错误?
编辑 1:完整错误消息
Test Database function
1) saves a new record
2) "after all" hook
0 passing (50s)
2 failing
1) Test Database function
saves a new record:
Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/ab/ab/abcd/api-testing/mongo-testing/my-mongo-tests/test/create_connection.js)
2) Test Database function
"after all" hook:
TypeError: Cannot read property 'dropDatabase' of undefined
at Context.after (test/create_connection.js:56:34)
mocha测试用例与普通的JS代码没有区别,因此会遵循JS代码的作用域隔离和流程。我试图修复测试用例以允许在各种测试用例和 before/after 挂钩中进行变量访问。
请注意,我没有执行实际的测试用例,您可能需要修改下面的代码才能使运行成功为您
'use strict';
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const chai = require('chai');
const expect = chai.expect;
/**
*
* Create a new schema that accepts a firstname and lastname and employee id
*/
const testSchema = new Schema({
firstname: { type: String, required: true },
lastname: { type: String, required: true },
id: { type: Number, required: true }
});
/**
*
* Create a new collection name employee_details
*/
const employee_details = mongoose.model('employee_details', testSchema);
/**
* Decalre the db const in this(global) context so this variable is visible by all test cases
*/
const db;
// describe('Create a connection with the database', () => {
// // Seems redundet to something
// // Also the context is lost if you do this ..
// // Thus not allowing for you to use variables .. const db in this case
// // If you still want this describe, you will have to use it like any other javascript function ... to expose the variables
// });
describe('Test Database function', () => {
// connect to database
before((done) => {
mongoose.connect('mongodb://127.0.0.1:27017/new_demo');
//Keep the url same which you use to debug you local application
db = mongoose.connection;
db.on('error', console.error.bind(console, 'Error connecting to DB'));
db.once('open', () => {
console.log('Connected to new_demo db');
done();
});
});
//Save something with value Mike Stevens, 19981
it('saves a new record', (done) => {
// Also if you want to increase the deafult timeout of a teast case
// you will have to change the => to function(), because of the way 'this' context behaves
// Thus :
// it('saves a new record', function(done) {
// this.timeout(10000);
// .. test case code
// }
var first_record = employee_details({
firstname: 'Mike',
lastname: 'Stevens',
id: 19981
});
first_record.save(function(err) {
if (err) return handleError(err);
// saved!
done();
//I used a simple callback function instead, makes life easier and code understable
})
});
after((done) => {
mongoose.connection.db.dropDatabase(() => {
mongoose.connection.close(done);
// I am guessing same goes here ..
// keep it simple !!
});
});
});
现在一些理论,理想情况下,不推荐或更确切地说不在单元测试用例的范围中以实际连接到数据库and/or 以任何方式修改外部实体的状态(因为你特别提到'it is a unit test case')。
单元测试应避免进行外部调用或调用实际的 API。我们应该存根调用,并在我们的测试用例中断言调用是在我们预期的时候进行的,或者是在提供了适当的输入时进行的。
这是一个言出必行的例子:
//This is myGLobalServiceLoactor which is used in actual code which is to be tested.
myGLobalServiceLoactor = {
database: {
save: sinon.stub(),
find: sinon.stub()
}
}
it('to check if external method is called ', () => {
let person_to_Save = {
//. . .
//. . .
}
proxyPersonInterface.savePerson(input_person).then((status) => {
// check if our stubbeb function is called
assert(myGLobalServiceLoactor.database.save.calledOnce);
});
});
并且您可以使用像 Sinon and rewire 这样的辅助库来存根和代理单元测试用例中的实际模块。 希望对您有所帮助。