unit testing使用请求,pipe道和stream使用模拟的私有方法

我想在下面的代码中unit testing导出的方法。 我想嘲笑私有方法中的值来控制返回的Promise的拒绝/parsing。 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) } 

为了unit testing函数importDomain,你将需要模拟请求。 它是你的模块所需要的,所以应该被认为是testing和正常工作。

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

简单地通过replacereq.pipe,您将能够控制传递给您的客户端创build的stream的内容。