Проведение супертеста до инициализации API

У меня есть тест мокко с использованием Supertest экспресс-API, который использует MongoDB. MongoDB работает, но в настоящее время у меня есть Supertest require и я использую экспресс-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 запускает тест на моем API до того, как будет установлено соединение MongoDB. Как правильно удержать его до полной инициализации моего API?

Я полагаю, что если я проведу тест через Grunt после запуска экспресса, все будет хорошо, но поскольку Supertest может запустить экспресс от моего имени, я надеялся начать с такого подхода.

3 ответа

Вы можете сделать следующее:

describe( "/api/lists", function() {
    before(function(done) {
        mongoose.connect(config.db.mongodb);
        done();
     });
     it( "should be loaded", function() {
         ....

Поскольку Mongoose буферизует запросы до тех пор, пока соединение не станет доступным, следующей настройки должно быть достаточно:

describe('test', function () {
  before(mongoose.connect.bind(mongoose, connectionString));

  // do your tests...
);

Но из того, что я могу сказать по сообщению об ошибке, похоже, что вы не можете инициализировать свои модели. Какой актуальный код на api.js:63:5?

Я запускаю свои тесты, используя Mockgoose, оболочку в памяти для mongoose. Я подозреваю, что нет измеримого времени соединения. Я выполняю свои тесты в среде только для тестирования, в которой не указано мое свойство конфигурации url. Моя инициализация мангуста выглядит так:

    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. У меня были проблемы с запросами, которые объединяют $ или и $ elemMatch.

Другие вопросы по тегам