我试图模拟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 =新的sql.ConnectionPool(config)
19 x .connect()
^
20 \.then(池=> {
21 \log.info(“连接到Server”);
22 \x{e76f}返回池;
发布于 2021-09-30 22:51:35
这可能是一个解决办法。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;它看上去可行,但我不确定它是否正确。
https://stackoverflow.com/questions/69371456
复制相似问题