Экспресс-тестирование JS Integration с использованием супертестов и пробных баз данных
Можно ли протестировать Express JS REST API, используя supertest, но заменив фактическое соединение с базой данных фиктивным объектом базы данных? У меня есть модульные тесты, охватывающие модели базы данных и другие части приложения, а также функциональные тесты конечных точек API, выполняющих фактические подключения к базе данных, но у меня есть странное требование создавать интеграционные тесты, которые похожи на функциональные тесты, но используют фиктивные подключения к базе данных. Пример контроллера конечной точки приведен ниже:
var model = require('../../../lib/models/list');
module.exports = {
index: function(req, res) {
var data = { key: 'domains', table: 'demo.events'};
var dataModel = new model(data);
dataModel.query().then(function(results) {
res.respond({data: results}, 200);
}).fail(function(err) {
console.log(err);
res.respond({message: 'there was an error retrieving data'}, 500);
});
}
};
И индекс для URI
var express = require('express'), app, exports;
app = exports = module.exports = express();
exports.callbacks = require('./controller');
app.get('/', exports.callbacks.index);
Модель списка, используемая в контроллере, подключается к базе данных и извлекает данные, которые выводятся. Задача состоит в том, чтобы высмеять этот фактический вызов базы данных, в то же время используя supertest для выполнения запроса и извлечения данных из URI.
Любая информация будет полезна, в том числе, если вы считаете, что это плохая или бессмысленная идея
1 ответ
У меня был ограниченный успех с 2 подходами:
1) использовать rewire, чтобы заменить библиотеку драйвера базы данных, такую как mongodb, на поддельную, возможно, используя возможности spy/stub/mock от sinon
2) Установите свою БД в качестве настройки приложения через app.set('mongodb', connectedDb)
для dev/prod, но в тестовой среде вместо этого установите фиктивную базу данных. Это требует, чтобы ваш код для доступа к БД (как правило, модели) получал БД из приложения, или был бы дружественным по отношению к макету или разработан с шаблоном внедрения зависимостей.
Ничто из этого не делает все чистым и безболезненным, но я извлек из них некоторую пользу.