nodeJS proxyquire 覆盖 require 的特定功能
Posted
技术标签:
【中文标题】nodeJS proxyquire 覆盖 require 的特定功能【英文标题】:nodeJS proxyquire overwrite specific function of a require 【发布时间】:2015-05-14 20:52:01 【问题描述】:我目前正在使用 proxquire 单独测试一个模块以覆盖该模块的要求。
使用 proxyquire 覆盖 require 的路径可以正常工作。例如:
var bar = require('./bar');
但是您是否也可以使用 proxyquire 仅覆盖模块中需要测试的模块的特定功能?所以像:
var bar = require('./foo').bar();
我需要为此留在 proxyquire,因为我正在使用它来模拟在架构的另一层发生的 http 请求。但是在测试的情况下,我还需要在模块中模拟“现在”的时间。
所以目前我有这个:
var uraStub = sendMockRequest(paramListOfCheckin, queryList);
var setNowStub = function() return 1425998221000; ;
var checkin = proxyquire('../src/logic/logicHandlerModules/checkin',
'../../persistence/ura' : uraStub,
'./checkin.setNow' : setNowStub
);
checkin.checkin(...)
setNow 的实现是:
var setNow = function()
return new Date().getTime();
;
var checkin = function (...)
var now = require('./checkin').setNow();
显然,proxyquire 中的'./checkin.setNow' : setNowStub
不起作用,因为这是错误的路径。但是由于对象定义中的语法错误,使用'./checkin'.setNow() : setNowStub
也不起作用。
有什么建议吗?
提前致谢!
【问题讨论】:
【参考方案1】:您正在寻找的是 noCallThru() 和 callThru() 方法。 https://github.com/thlorenz/proxyquire#preventing-call-thru-to-original-dependency
默认情况下,proxyRequire 将调用模拟依赖项,这将允许您选择要使用自己的自定义函数覆盖的方法。
因此,如果路径 '../foo' 中的依赖项具有方法 bar() 和 fooBar(),您就可以通过做来模拟 bar。
proxyquire.callThru();
var fooFunc = proxyquire('../foo',
bar: () => return 'bar'
)
现在 bar() 将点击您的自定义覆盖函数,而 fooBar() 将正常调用。
【讨论】:
以上是关于nodeJS proxyquire 覆盖 require 的特定功能的主要内容,如果未能解决你的问题,请参考以下文章