Проведение супертеста до инициализации 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.