Я в отчаянии, я реализовал простой сервис RESTful на основе NodeJS / ExpressJS и попытался написать интеграционный тест с mocha
и chai/chai-http
для него.Один из реализованных маршрутов создает проблемы, тест все равно не выполняется из-за превышения времени ожидания.Если я получаю доступ к этому маршруту вручную с помощью моего клиента RESTful, кажется, что все работает!
Сообщение об ошибке от mocha:
Error: Timeout of 100000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\...\tests\index.js)
Что уже работает:
- Вручнуюдоступ по маршруту (см. выше) через RESTful-клиент
- Проверка других маршрутов с помощью методов GET, например
- Проверка маршрута (см. выше), если отправляется ответ с фиктивной полезной нагрузкой до часть запроса mongoose / database
Ни успешный обратный вызов Promise внутри теста не вызывается с объектом ответа, ни произошла ошибка!Тем не менее тайм-аут теста превышен, и мокко его убивает.
Это маршрут, реализованный как часть службы:
router.post('/signup', function(request, response, next) {
let user = new User(request.body);
user.password = User.hashProperty(user.password); // Store password as hash
User.create(user).then((newUser) => {
return response.formatter.resolve(newUser.toPrivateJSON(), 201);
}).catch((error) => {
console.log('error');
return next(error);
});
});
А вот тест, основанный на мокко и чае:
describe('/api/users/signup', function() {
it('Should create a new user account', function(done) {
this.timeout(100000);
let user = {
name: 'User',
email: 'user@web.de',
password: 'abc123'
}
chai.request(app)
.post('/api/users/signup')
.send(user)
.then((response) => {
response.should.have.status(201);
done();
})
.catch((error) => {
return done(error);
});
});
});
Есть идеи по этому поводу?Странно то, что без доступа к базе данных / мангусте тест прошел успешно, и все, кажется, работает ... Этот пост , кажется, имеет дело с той же / связанной темой, но на самом деле это не помогает.
РЕДАКТИРОВАТЬ 01/31/2019
После замены chai/chai-http
на supertest
поведение не меняется.Также после замены библиотеки тестирование маршрута все равно не прошло.Как я и догадался, проблема, похоже, заключается в асинхронном маршруте или асинхронном доступе mongoose.
По соображениям целостности здесь приведен интеграционный тест, написанный на supertest
:
describe('/signup', function() {
it('Should create a new user account', function() {
let user = {
name: 'User',
email: 'user@web.de',
password: 'abc123'
};
return supertest(app)
.post('/api/users/signup')
.set('Accept', 'application/json')
.send(user)
.then((response) => {
assert.strictEqual(response.status, 201);
});
});
});
Понятия не имеюкак я успешно провожу интеграционный тест!Есть идеи?
РЕДАКТИРОВАТЬ 01/31/2019
В другом посте Я нашел полезную подсказку и, похоже, локализовал проблему!Проблема в том, что перед интеграционным тестом запустите модульное тестирование модели мангуста, и этот тест уже установил соединение мангусты!Если я закомментирую этот модульный тест, мой тест на интеграцию (см. Выше) работает.Как я могу управлять / делиться подключением?Поскольку первое соединение для модульного теста открывается вручную (см. Ниже), а второе соединение открывается внутри app
как часть службы.
Первое соединение открыто для целей тестирования модели (tests/models/article.js
):
before((done) => {
mongoose.connect(process.env.DATABASE_PATH || 'mongodb://localhost/natter-dev',
{useNewUrlParser: true, useFindAndModify: false, useCreateIndex: true});
mongoose.connection.once('open', done);
mongoose.connection.on('error', (error) => {
console.error.bind(console, error);
});
});
Второе соединение как часть службы (app.js
):
...
// Establishes the mongo database connection
mongoose.connect(config.database.path,
{useNewUrlParser: true, useFindAndModify: false, useCreateIndex: true}, (error) => {
if(error) {
throw error;
}
});
module.exports = app;
Импортируется с помощью интеграционного теста (см. Выше) через const app = require('../../app');
Выполнениеоба фрагмента кода, кажется, приводят к моей проблеме, потому что мангуст соединение с одной и той же базой данных открывается дважды!