Экспресс-тестирование интеграции JS с Supertest и макетной базой данных

Можно ли протестировать Express JS REST API, используя супертест, но заменив фактическое соединение с базой данных фиктивным объектом базы данных? У меня есть модульные тесты, охватывающие модели баз данных и другие части приложения, а также функциональные тесты конечных точек 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);

Модель списка, используемая в контроллере, подключается к базе данных и извлекает выходные данные. Задача состоит в том, чтобы имитировать этот фактический вызов базы данных, но при этом использовать супертест для выполнения запроса и извлечения данных из URI.

Любая информация будет полезна, в том числе если вы считаете, что это плохая или бессмысленная идея.


person Jazzuzz    schedule 17.10.2013    source источник


Ответы (1)


У меня был ограниченный успех с двумя подходами:

1) используйте rewire, чтобы заменить библиотеку драйверов базы данных, например mongodb, на издевался над одним, возможно, используя возможности шпиона/заглушки/мока sinon

2) Установите свою базу данных в качестве параметра приложения через app.set('mongodb', connectedDb) для dev/prod, но вместо этого в тестовой среде установите фиктивную базу данных. Для этого требуется, чтобы ваш код доступа к базе данных (обычно модели) получал базу данных из приложения или иным образом был удобен для макетов или был разработан с использованием шаблона внедрения зависимостей.

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

person Peter Lyons    schedule 04.04.2014