Экспресс-тестирование 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, но в тестовой среде вместо этого установите фиктивную базу данных. Это требует, чтобы ваш код для доступа к БД (как правило, модели) получал БД из приложения, или был бы дружественным по отношению к макету или разработан с шаблоном внедрения зависимостей.

Ничто из этого не делает все чистым и безболезненным, но я извлек из них некоторую пользу.

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