Jest - 函数内的存根函数

时间:2018-05-06 08:04:59

标签: javascript unit-testing jest

我正在编写单元测试,我需要为函数内的函数设置模拟响应。

这是我想要模拟的功能:

cassandraDriver.js

module.exports = ({
  cassandra_user,
  cassandra_password,
  cassandra_address
}) => {
  if (!cassandra_address.length) throw Error('Cassandra address is not valid')
  return new Promise((resolve, reject) => {
    try {
      const client = new driver.Client({
        contactPoints: cassandra_address.split(','),
        authProvider: authProvider(cassandra_user, cassandra_password),
        queryconfig: {
          consistency: driver.types.consistencies.quorum
        }
      })
      return resolve(client)
    } catch (e) {
      reject(e)
    }
  })
}

这是使用它的文件:

const {
  cassandraDriver
} = require('./lib')

    module.exports = async ({
      username = 'cassandra', //default values
      password = 'cassandra', //default values
      address,
      keyspace,
      replication_factor = 1,
      migration_script_path,
      logger = require('bunyan').createLogger({name: 'BuildCassandra'})
} = {}) => {
  try {
       const client = await cassandraDriver(username, password, address)
    }).catch(err => {
      throw Error(err)
    })
  } catch (e) {
    logger.error(e)
    throw e
  }
}

如何在单元测试中模拟对'cassandraDriver'的调用?我尝试使用重新连接,但该方法没有像通常那样暴露。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

让我们修改你的功能,以便它可以接受模拟驱动程序而不是cassandraDriver

MyLabel

(我还删除了一个多余的.catch块)

接下来,你应该创建一个" cassandra-driver-mock.js"它模拟cassandra驱动程序的行为以进行单元测试

当然,单元测试会将模拟而非真实驱动程序作为选项参数传递

答案 1 :(得分:0)

您可以存储在测试文件中导出cassandraDriver的模块:

import cassandraDriver from "<path-to-cassandraDriver.js>";

jest.mock("<path-to-cassandraDriver.js>", () => jest.mock());

cassandraDriver.mockImplementation(() => {
  // Stub implementation and return value
});

有关详细信息,请参阅Manual Mocks