2013-11-20 1 views
1

У меня возникли проблемы написания тестов для моих Mongoose моделей и мой экспресс-приложений (маршрутов)Тайм-аут при выполнении теста мокко на модели мангустов и экспресс-маршрут

У меня есть очень простой app.js файл:

var env = process.env.NODE_ENV || 'development', 
    express = require('express'), 
    config = require('./config/config')[env], 
    http = require('http'), 
    mongoose = require('mongoose'); 

// Bootstrap db connection 
mongoose.connect(config.db) 

// Bootstrap models 
var models_path = __dirname + '/app/model'; 
fs.readdirSync(models_path).forEach(function(file) { 
    if (~file.indexOf('.js')) { 
     require(models_path + '/' + file); 
    } 
}); 

var app = express(); 

// express settings 
require('./config/express')(app, config); 

// Bootstrap routes 
require('./config/routes')(app, compact); 

if (!module.parent) { 
    app.listen(app.get('port'), function() { 
     console.log('Server started on port ' + app.get('port')); 
    }) 
} 

module.exports = app; 

У меня есть папка с именем model, которая содержит монгольские модели.

У меня есть папка test с accountTest.js - выглядит как это:
(Это, чтобы проверить мою модель счета)

var utils = require('./utils'), 
    should = require('chai').should(), 
    Account = require('../app/model/account'); 

describe('Account', function() { 
    var currentUser = null; 
    var account = null; 

    it('has created date set on save', function(done) { 
    var account = new Account(); 

    account.save(function(err) { 
     account.created.should.not.be.null; 
     done(); 
    }); 
    }); 

утилиты взята отсюда: http://www.scotchmedia.com/tutorials/express/authentication/1/06

это работает , если я оставлю это только в одном тесте.

Если добавить еще один тест, чтобы проверить мой экспресс-маршрут, что-то вроде этого:

var request = require('supertest'), 
    app = require('../../app'), 
    should = require('chai').should(); 

describe('Account controller', function() { 

    it('GET /account returns view', function(done) { 
     //omitted for brevity 
     done(); 
    }); 
}); 

Тогда я получаю ошибку тайм-аута, на моих тестах для моей модели ...

линии, что делает это app = require('../../app')
Если я удалю это, тогда нет таймаута.

Я понимаю, что это может быть связано с соединением мангуста, но не уверен, как «разделить» его между тестами?

ответ

0

мокко имеет root Suite:

You may also pick any file and add "root" level hooks, for example add beforeEach() outside of describe()s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root Suite with no name.

использовать, чтобы начать свой экспресс-сервер один раз (и мы используем переменную окружения так, что он работает на другом порту, чем наш сервер развития):

before(function() { 
    process.env.NODE_ENV = 'test'; 
    require('../../app.js'); 
}); 

(Здесь нам не нужен done(), потому что требование является синхронным.) Это был сервер, который запускается ровно один раз, независимо от того, сколько разных тестовых файлов содержит этот корневой уровень before функция.

+0

Но я не хочу/нуждаюсь в/app.js в моих тестах модели Mongoose, или я? – Alex

+0

Основная идея состоит в том, чтобы использовать оператор before, обернутый вокруг всех тестов, которые будут нуждаться в этой функции, чтобы избежать двойного вызова. Вы можете просто потребовать свои модели Mongoose, хотя, если у вас есть другие тесты, которые испытывают Express и Express, потребуются ваши модели, тогда вам может быть лучше, чем просто требовать Express. – dankohn

+0

Wyy мне нужен app.js (экспресс), если я только хочу проверить свою модель, хотя ... это не имеет смысла? Конечно, должен быть лучший способ. – Alex