【问题标题】:How to mock SQL Server connection pool in node如何在节点中模拟 SQL Server 连接池
【发布时间】:2021-11-21 01:40:33
【问题描述】:

我正在尝试模拟 SQL Server 连接池,以便测试 DAL 的功能。

我有一个连接池文件

connectionPool.js

const sql = require('mssql');
const log = require('../services/logger');

const config = {
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  server: process.env.SERVER,
  database: process.env.DATABASE
};

const poolPromise = new sql.ConnectionPool(config)
  .connect()
  .then(pool => {
    log.info('Connected to SQL Server');
    return pool;
  })
  .catch(err => {
    log.error(err, 'Database connection failed');
  });

module.exports = poolPromise;

我在 DAL 中使用它。非常精简,但必需品在那里。

const {poolPromise} = require('./connectionPool');

const getData = async () => {
  const pool = await poolPromise;
  const request = pool.request()
  const result = await request('SELECT * FROM table');
}

这样,每个应用程序只创建一次连接池。 (见How can I use a single mssql connection pool across several routes in an Express 4 web application?

我想模拟mssql 模块,以便连接池功能仍然有效。我尝试了多种选择。 How to mock SQL Server connection pool using Jest? 让我很接近,但它并不完全在那里。

__mocks/mssql.js

const mockExecute = jest.fn();
const mockInput = jest.fn(() => ({ execute: mockExecute }));
const mockRequest = jest.fn(() => ({ input: mockInput }));

jest.mock('mssql', () => ({
  ConnectionPool: jest.fn(() => ({request: mockRequest})),
  NVarChar: jest.fn()
}));

const sql = require('mssql');

module.exports = sql;

但是我得到了错误

TypeError: (中间值).connect 不是函数

17 |
18 | const poolPromise = new sql.ConnectionPool(config)
19 | .connect()
| ^
20 | .then(池 => {
21 | log.info('连接到 SQL Server');
22 |返回池;

【问题讨论】:

    标签: node.js jestjs node-mssql


    【解决方案1】:

    可能是一个解决方案。 connectionPool.js 的一点重构

    const sql = require('mssql');
    const log = require('../services/logger');
    
    const config = {
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      server: process.env.SERVER,
      database: process.env.DATABASE
    };
    if (process.env.NODE_ENV === 'development') {
      config.options = {
        encrypt: false,
        trustServerCertificate: true
      };
    }
    
    const connectionPool = new sql.ConnectionPool(config);
    const poolPromise = connectionPool
      .connect()
      .then(pool => {
        log.info('Connected to MSSQL');
        return pool;
      })
      .catch(err => {
        log.error(err, 'Database connection failed');
      });
    
    module.exports = poolPromise;
    

    然后在/__mocks__/mssql.js

    'use strict';
    
    const mockExecute = jest.fn();
    const mockInput = jest.fn().mockReturnValue({ execute: mockExecute });
    const mockQuery = jest.fn().mockReturnValue({recordset: 'Mock data'});
    const mockRequest = jest.fn().mockReturnValue({
      input: mockInput,
      query: mockQuery
    });
    
    const mockTransaction = jest.fn().mockImplementation(() => {
      return {
        begin: callback => callback(),
        commit: jest.fn(),
        rollback: jest.fn()
      };
    });
    
    const mockConnect = jest.fn().mockImplementation(() => {
      return Promise.resolve({ transaction: mockTransaction });
    });
    
    jest.mock('mssql', () => ({
      ConnectionPool: jest.fn().mockReturnValue({
        request: mockRequest,
        connect: mockConnect
      }),
      Request: mockRequest,
      NVarChar: jest.fn()
    }));
    
    const mssql = require('mssql');
    
    module.exports = mssql;
    

    它似乎有效,但我不确定它是否正确

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      相关资源
      最近更新 更多