Jest - функция-заглушка внутри функции - PullRequest
0 голосов
/ 06 мая 2018

Я пишу юнит-тесты, где мне нужно установить ложный ответ для функции внутри функции.

Это функция, которую я хочу издеваться:

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' в модульных тестах? Я попытался использовать rewire, но метод не раскрывается, как обычно. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы можете заглушить модуль, который экспортирует cassandraDriver в ваш тестовый файл:

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

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

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

См. Ручные макеты для получения дополнительной информации.

0 голосов
/ 06 мая 2018

давайте изменим вашу функцию, чтобы она могла принимать фиктивный драйвер вместо cassandraDriver

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

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

(я также удалил лишний блок .catch)

затем вы должны создать "cassandra-driver-mock.js", который имитирует поведение драйвера cassandra для ваших юнит-тестов

модульные тесты, конечно же, передают макет вместо реального драйвера в качестве параметра параметра

...