Модульное тестирование частного метода, который использует запрос, канал и поток, используя макеты

Я хочу провести модульное тестирование экспортированного метода в приведенном ниже коде. Я хочу смоделировать значения в приватном методе, чтобы управлять отклонением / разрешением возвращенного Обещания. client это объект node-postgres, который уже подключен к базе данных.

Я знаю, что могу использовать proxyquire, чтобы заглушить необходимые библиотеки, но как я могу издеваться над связанными методами .on('error', ...), .pipe(stream) а также .on('end', ...) так что я могу контролировать возвращаемые значения.

Обратите внимание, что показанный экспортированный метод является упрощением реального, а экспорт importDomain невозможен.

const copyFrom = require('pg-copy-streams').from
const request = require('request')
const Promise = require('bluebird')

// private
function importDomain (client, domain) {
    return new Promise((resolve, reject) => {
    let stream = client.query(copyFrom(`COPY ${domain.table} FROM STDIN;`))

    let req = request(`${domain.url}`)
    req.on('error', reject)
    req.pipe(stream)
       .on('error', reject)
       .on('end', resolve)
  })
}

// public
module.exports = (client) => {
  let domain = someFunctionReturningDomain()
  importDomain(client, domain)
}

1 ответ

Чтобы выполнить модульное тестирование функции importDomain, вам необходимо смоделировать запрос. Это требуется вашим модулем, поэтому следует считать, что оно протестировано и работает нормально.

Так как вы предоставляете клиента в качестве параметра. Его метод запроса и возвращаемый поток уже находятся под полным контролем модуля.

Просто заменив req.pipe, вы сможете контролировать то, что передается в поток, созданный вашим клиентом.

Другие вопросы по тегам