簡體   English   中英

Jest - 在解構模塊上模擬一組函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM