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 的特定功能的主要内容,如果未能解决你的问题,请参考以下文章

proxyquire 错误:ENOENT:没有这样的文件或目录,scandir

使用 webpack 的 Proxyquire 无法编译

无法使用 proxyquire 正确存根

如何使用 proxyquire 模拟“请求”

如何使用 Jest 和 Proxyquire 存根模块?

TypeError:AWS.SecretsManager 不是使用 proxyquire 进行单元测试的构造函数