[英]Jest - mock a set of functions on a destructured module
我們在私有存儲庫中有自定義庫,它接受來自 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 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
}
該庫導出 function,因此可以以解構方式使用它:
// 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();
});
在另一個文件中,我試圖像這樣模擬 function:
//conn.test.js
jest.mock('@upbs/nodejs-connection', () => ({
mysql: {
getConnection: jest.fn(() => ({
select: jest.fn().mockReturnThis(),
from: jest.fn().mockReturnThis(),
}))
}
}))
這似乎工作正常,但它會引發錯誤,因為我還沒有實現.then
、 .catch
或.finally
我嘗試添加 .then 的實現.then
但在mysql.getConnection
function 時出現超時。
我猜添加.then
實現會失敗,因為它不是 mysql.getConnection 實際返回的mysql.getConnection
函數的一部分
如何添加.then
、 .catch
和.finally
的實現?
以下模擬設置應該讓您繼續前進。 對from
方法的調用需要返回一個 promise ,它具有 then 方法。 無論 promise 的結果如何,都將調用 finally,因此還為destroy
方法提供了一個模擬實現。
mysql: {
getConnection: jest.fn(() => ({
select: jest.fn().mockReturnThis(),
from: jest.fn().mockResolvedValueOnce({ col1: 10, col2: 20, col3: 30 }),
destroy: jest.fn().mockReturnThis()
}))
}
考慮重構代碼以遵循單一職責原則,這將使編寫測試更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.