【问题标题】:Unit test a private method that uses request, pipe and stream using mocks使用模拟单元测试使用请求、管道和流的私有方法
【发布时间】:2017-07-24 03:20:31
【问题描述】:

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

【问题讨论】:

    标签: node.js proxyquire nodejs-stream pg-copy


    【解决方案1】:

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

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

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

    【讨论】:

    • .on() 是如何测试的?我想看一些代码示例来说明如何做到这一点。
    • 模拟请求时,将其实现为可写流,并在测试时向其写入数据。见stackoverflow.com/questions/33141012/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2014-01-18
    • 2022-01-23
    相关资源
    最近更新 更多