Javascript Jest-模拟解构模块上的一组函数
我们在一个私有存储库中有一个自定义库,它接受来自AWS Secrets Manager的secretId,并返回一个初始化的knex连接 代码如下:Javascript Jest-模拟解构模块上的一组函数,javascript,node.js,amazon-web-services,unit-testing,jestjs,Javascript,Node.js,Amazon Web Services,Unit Testing,Jestjs,我们在一个私有存储库中有一个自定义库,它接受来自AWS Secrets Manager的secretId,并返回一个初始化的knex连接 代码如下: // mysql.js async function getConnection (secretId, dbname) { AWS.config.update({region:process.env.REGION}) const secretsManager = new AWS.SecretsManager() let
// mysql.js
async function getConnection (secretId, dbname) {
AWS.config.update({region:process.env.REGION})
const secretsManager = new AWS.SecretsManager()
let secret
console.log(`Getting secret from ${secretId}`)
try {
const secretValue = await secretsManager.getSecretValue({
SecretId: secretId
}).promise()
secret = JSON.parse(secretValue.SecretString)
} catch (e) {
console.log(`Error: Unable to get secret from ${secretId}`)
return null
}
console.log(`Initialzing a connection to ${secret.proxyendpoint}:${secret.port}/${dbname} as ${secret.username}`)
const knex = require('knex')(
{
client: 'mysql2',
connection: {
host: secret.proxyendpoint,
user: secret.username,
database: dbname,
port: secret.port,
ssl: 'Amazon RDS',
password: secret.password
}
}
)
return knex
}
库将导出函数,以便以非结构化方式使用:
// index.js
exports.mysql = require('./mysql');
这里使用的是:
// conn.js
const {mysql} = require('@org/knex-conn');
const connection = await mysql.getConnection(secretId, dbName);
await connection
.select('col1', 'col2', 'col3')
.from('table')
.then((rows) => {
console.log(`${row['col1']} ${row['col2']} ${row['col3']}`);
})
.catch((err) => {
console.log( err); throw err
})
.finally(() => {
connection.destroy();
});
在另一个文件中,我试图模拟如下函数:
//conn.test.js
jest.mock('@upbs/nodejs-connection', () => ({
mysql: {
getConnection: jest.fn(() => ({
select: jest.fn().mockReturnThis(),
from: jest.fn().mockReturnThis(),
}))
}
}))
这似乎工作正常,但它抛出了一个错误,因为我没有实现。然后,。catch
或。最后
我尝试添加一个的实现,然后
但是调用mysql.getConnection
函数时超时
我猜添加。然后
实现失败,因为它不是mysql.getConnection实际返回的knex函数的一部分
如何添加的实现。然后
、捕获
和。最后
?下面的模拟设置应该让您继续。从
方法调用,需要返回一个承诺,该承诺随后包含一个方法。Finally将被调用,与promise的结果无关,因此也为destroy
方法提供了一个模拟实现
mysql: {
getConnection: jest.fn(() => ({
select: jest.fn().mockReturnThis(),
from: jest.fn().mockResolvedValueOnce({ col1: 10, col2: 20, col3: 30 }),
destroy: jest.fn().mockReturnThis()
}))
}
考虑重构代码以遵循单一责任原则,这将使编写测试更容易。这与您编写的代码一样有效,但它仍然使用真正的。然后实现。我曾尝试添加一个模拟实现,但它给我的超时错误与我以前看到的相同。下面是我添加的模拟实现`then:jest.fn((行)=>{console.log('using mock');}),