Как смоделировать соединение с базой данных узла в модульных тестах?
Я использую драйвер базы данных 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 и успешных запросов. не регрессировал