首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在节点中模拟Server连接池

问如何在节点中模拟Server连接池
EN

Stack Overflow用户
提问于 2021-09-29 06:35:15
回答 1查看 562关注 0票数 0

我试图模拟Server连接池,以便测试DAL的功能。

我有一个连接池文件

connectionPool.js

代码语言:javascript
复制
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上。精简单单,但必需品在那里。

代码语言:javascript
复制
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

代码语言:javascript
复制
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 =新的sql.ConnectionPool(config)

19 x .connect()

^

20 \.then(池=> {

21 \log.info(“连接到Server”);

22 \x{e76f}返回池;

EN

回答 1

Stack Overflow用户

发布于 2021-09-30 22:51:35

这可能是一个解决办法。connectionPool.js的重构

代码语言:javascript
复制
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

代码语言:javascript
复制
'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;

它看上去可行,但我不确定它是否正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69371456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档