我有一个mocha测试,使用的是使用MongoDB的express API的Supertest。MongoDB正在运行,但我目前正在使用Supertest require并使用express 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完全初始化之前,有什么正确的方法可以让它保持不变?
我想,如果我在启动express之后通过Grunt运行测试,这将是很好的,但是因为Supertest可以代表我启动express,所以我希望从这种方法开始。
发布于 2015-02-19 02:25:10
您可以执行以下操作:
describe( "/api/lists", function() {
before(function(done) {
mongoose.connect(config.db.mongodb);
done();
});
it( "should be loaded", function() {
....发布于 2015-02-19 03:38:07
我使用Mockgoose运行测试,Mockgoose是mongoose的内存包装器。我怀疑没有可测量的连接时间。我在不指定url配置属性的test only环境中执行测试。我的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在内存中,所以速度非常快。缺点是并不是所有的mongoose操作都被mockgoose支持。我在结合使用$or和$elemMatch的查询时遇到了一些问题。
发布于 2015-02-23 06:07:41
由于Mongoose会在连接可用之前缓冲查询,因此下面的设置应该足够了:
describe('test', function () {
before(mongoose.connect.bind(mongoose, connectionString));
// do your tests...
);但从我从错误消息中可以看出,您似乎未能初始化您的模型。api.js:63:5的实际代码是什么
https://stackoverflow.com/questions/28469241
复制相似问题