我使用Supertest对使用MongoDB的快速API进行了mocha测试。 MongoDB正在运行,但我目前正在使用Supertest需要并使用快速API,而不是单独启动它(我更喜欢这种方法):
var request = require( 'supertest' );
var chai = require( 'chai' );
var api = require( '../../server/api.js' );
chai.should();
describe( "/api/lists", function() {
it( "should be loaded", function() {
api.should.exist;
} );
it( "should respond with status 200 ", function( done ) {
request( api )
.get( '/api/lists' )
.expect( 200, done );
} );
} );
当测试运行时,它会失败:
TypeError: Cannot call method 'collection' of undefined
at app.get.listId (/my/path/api.js:63:5)
我怀疑supertest在建立MongoDB连接之前正在我的API上运行测试。在我的API完全初始化之前,有什么方法可以让它推迟?
我想如果我在启动快递后通过Grunt进行测试,那就没事了,但是由于Supertest可以代表我开始表达,我希望从这个方法开始。
答案 0 :(得分:1)
您可以执行以下操作:
describe( "/api/lists", function() {
before(function(done) {
mongoose.connect(config.db.mongodb);
done();
});
it( "should be loaded", function() {
....
答案 1 :(得分:0)
我使用Mockgoose运行我的测试,Mockgoose是mongoose的内存包装器。我怀疑没有可测量的连接时间。我使用仅测试环境执行我的测试,该环境未指定我的url配置属性。我的mongoose初始化看起来像这样:
if (url) {
config.logger.info('Attempting Mongoose Connection: ', url);
db.connection = connection = mongoose.createConnection(url, {
server: {
keepAlive: 1, auto_reconnect: true
},
user: db.username,
pass: db.password
});
} else {
config.logger.info('No database specified, using Mockgoose in memory database');
config.mockgoose = require('mockgoose')(mongoose);
}
在我的测试中:
describe('Mockgoose tests', function() {
beforeEach(function(done) {
config.mockgoose.reset(); // Start with empty database
// Other database initialization code here
done();
}
it('Mockgoose test', function(done) {
...
}
}
这允许我将数据集或单个对象加载到数据库中。由于mockgoose在记忆中,它非常快。缺点并非所有的猫鼬操作都得到了mockgoose的支持。我遇到了将$或$ elemMatch组合在一起的查询问题。
答案 2 :(得分:0)
由于Mongoose缓冲查询直到连接可用,因此以下设置应该足够了:
describe('test', function () {
before(mongoose.connect.bind(mongoose, connectionString));
// do your tests...
);
但是从错误信息中我可以看出,看起来你没有初始化你的模型。 api.js:63:5
的实际代码是什么?