Как смоделировать соединение с базой данных узла в модульных тестах?

Я использую драйвер базы данных Oracle для Node.js node-oracledb. Я провел некоторые исследования и не смог найти четкого решения о том, как выполнить модульное тестирование соединения с БД. Должен ли я подключиться к реальной базе данных или смоделировать соединение. Какой фреймворк будет хорош для подключения к БД Я хочу выполнить юнит тестовый пост-запрос /API/ логин, которые зависят от oracledb. Поделиться кодом ниже. Пожалуйста, руководство.

var express = require('express');
var router = express.Router();
var oracledb = require('oracledb');
var jwt = require('jsonwebtoken');
var database = {};

router.use('/', function postLogins(req, res) {

  database.user = req.body.email.toUpperCase();
  database.password = req.body.password;
  database.connectString = process.env.DB_HOST;

  oracledb.getConnection(
    database,
    function connectToDatabase(connectionError, connection) {
      var payload;

      if (connectionError) {
        res.set('Content-Type', 'application/json');
        res.status(500).send(JSON.stringify({
          status: 500,
          message: 'Error connecting to DB',
          detailed_message: connectionError.message
        }));
        return;
      }

      payload = {
        sub: req.body.email
      };

      res.status(200).json({
        user: req.body.email,
        token: jwt.sign(payload, process.env.SECRET_KEY, { expiresIn: '8h' })
      });

      connection.release(function onRelease(releaseError) {
        if (releaseError) {
          console.error(releaseError.message);
        } else {
          console.log('POST /logins : Connection released');
        }
      });
    }
  );
});

module.exports = router;

1 ответ

Должен ли я подключиться к реальной базе данных или смоделировать соединение.

Это действительно зависит от объема вашего теста. Oracle - это зависимость, которую вы не контролируете и с которой вам нужно взаимодействовать. Пока этот код выполняется в какой-то момент, он будет проверен, возможно, клиентом, но, надеюсь, до того, как он достигнет клиента. Я думаю, что оба подхода ценны.

Какой фреймворк будет хорош для насмешливого подключения к БД?

Я бы попробовал использовать какие-то шаблоны проектирования, чтобы изолировать ваши зависимости и повысить тестируемость. Анонимные функции с высокой степенью вложенности затрудняют изоляцию частей вашего кода, почти требуя от вас использования грубого обработчика. Есть пара опций, которые могут помочь разбить ваш обработчик и сделать его более тестируемым на уровне модуля. Я думаю, что первым шагом может быть извлечение вашего обработчика:

class PostLogins {
   constructor(db) {
     this.db = db || oracledb;
   }

   handle(req, res) {
     // use this.db
   }
}

var pl = new PostLogins();
router.use('/', pl.handle);

Это позволит вам напрямую использовать ваш обработчик, но, конечно, не будет проверять, подключен ли он к вашей среде. Это также позволяет вам обеспечить реализацию заглушки oracle для вашего модульного теста, чтобы убедиться, что поток вашего обработчика работает правильно. Даже при модульном тестировании с использованием заглушки-оракула вам не хватает информации о ваших реальных взаимодействиях с оракулом и ваших http-взаимодействиях. Еще один рефакторинг, который поможет с тестируемостью connectToDatabase,

В зависимости от зрелости вашего проекта, возможно, имеет смысл сначала создать крупномасштабный высокоуровневый тест, который запускает оракул, запускает ваш веб-сервер, а затем проверяет конечную точку и проверяет, был ли получен успешный ответ. Я бы выбрал этот подход, если он находится на очень раннем этапе жизненного цикла ваших проектов, и реализации все еще меняются ИЛИ, если ваш проект уже был выпущен для клиентов, чтобы позволить вам изменить реализации и рефакторинг и при этом все еще иметь тестовое покрытие для HTTP и успешных запросов. не регрессировал

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