Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jest-模拟解构模块上的一组函数_Javascript_Node.js_Amazon Web Services_Unit Testing_Jestjs - Fatal编程技术网

Javascript Jest-模拟解构模块上的一组函数

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

我们在一个私有存储库中有一个自定义库,它接受来自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
}
库将导出函数,以便以非结构化方式使用:

// 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');}),