gpt4 book ai didi

node.js - nodeJS proxyquire 覆盖要求的特定功能

转载 作者:行者123 更新时间:2023-12-05 07:55:58 27 4
gpt4 key购买 nike

我目前正在隔离测试一个模块,使用 proxquire 覆盖这个模块的要求。

覆盖 require 的路径可以很好地使用 proxyquire。例如:

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();

Obviousley './checkin.setNow' : setNowStub in proxyquire 不起作用,因为这是错误的路径。但是使用 './checkin'.setNow() : setNowStub 也不起作用,因为对象定义中的语法错误。

有什么建议吗?

提前致谢!

最佳答案

您正在寻找的是 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() 将正常调用。

关于node.js - nodeJS proxyquire 覆盖要求的特定功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29014179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com