单元测试使用模拟使用请求,管道和流的私有方法

Bri*_*ian 7 node.js proxyquire nodejs-stream pg-copy

我想在下面的代码中对导出的方法进行单元测试.我想模拟私有方法中的值来控制返回的Promise的拒绝/解析.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)
}
Run Code Online (Sandbox Code Playgroud)

YLS*_*YLS 1

为了对函数 importDomain 进行单元测试,您需要模拟请求。它是您的模块所必需的,因此应被视为经过测试并正常工作。

由于您提供客户端作为参数。它的查询方法和返回的流已经在模块之外的完全控制之下。

只需替换 req.pipe,您就可以控制传递给客户端创建的流的内容。