如何在单元测试中模拟节点数据库连接?

问题描述 投票:0回答:1

我正在为Node.js node-oracledb使用Oracle数据库驱动程序。我做了一些研究,但没有找到关于如何对DB连接进行单元测试的明确解决方案。我应该连接到真实数据库还是模拟连接。哪个框架适合模拟数据库连接?我想单独测试post post request / API / login,这取决于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;
node.js unit-testing oracledb oracledb-npm
1个回答
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的存根实现,以验证处理程序的流程是否正常工作。即使使用存根oracle进行单元测试,您也会忽略实际的oracle交互和http交互的覆盖范围。另一个有助于测试的重构是打破connectToDatabase

根据项目的成熟度,首先创建一个启动oracle的粗粒度高级测试,启动网络服务器,然后运行端点并验证是否已收到成功响应可能是有意义的。我会选择这种方法,如果它在项目生命周期的早期阶段,并且实现仍在改变或者如果您的项目已经发布到客户端,允许您更改实现和重构,并且仍然具有HTTP和成功请求的测试覆盖率没有倒退。

© www.soinside.com 2019 - 2024. All rights reserved.