持有Supertest直到API初始化

时间:2015-02-12 04:22:13

标签: node.js mocha supertest

我使用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可以代表我开始表达,我希望从这个方法开始。

3 个答案:

答案 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的实际代码是什么?