浅析Node.js中使用依赖注入的相关问题及解决方法

浅析Node.js中使用依赖注入的相关问题及解决方法,第1张

这篇文章主要介绍了浅析Nodejs中使用依赖注入的相关问题及解决方法,Nodejs是一个将JavaScript应用运行于服务器端的框架,需要的朋友可以参考下
最近,我转向使用依赖注入来帮助理解分离代码的简单途径,并有助测试。然而,Nodejs中的模块依赖Node提供的系统API,这很难判断私有依赖被恰当的使用。一般的依赖注入很难在这种情况下使用,但现在不要放弃希望。
requireCauses
问题
Nodejs很容易依照需求导入依赖。它运行的很好,并且比AMD模式加载器例如RequireJS要简单。当我们模拟那些依赖的时候问题就来了。如果Nodejs中模型的加载是受控的,我们怎么做才能控制让伪对象在测试期间被使用到我们可以使用Node的vm模式,通过vm我们可以再新的上下文中加载模型。运行在新的上下文中,我们可以控制需求反射出模型的方法。
解决方案
谢谢这篇文章,
现在可以给你提供一个相当不错的解决方案
代码在下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var
vm
=
require('vm');
var
fs
=
require('fs');
var
path
=
require('path');
/

Helper
for
unit
testing:

load
module
with
mocked
dependencies

allow
accessing
private
state
of
the
module


@param
{string}
filePath
Absolute
path
to
module
(file
to
load)

@param
{Object=}
mocks
Hash
of
mocked
dependencies
/
exportsloadModule
=
function(filePath,
mocks)
{
mocks
=
mocks
||
{};
//
this
is
necessary
to
allow
relative
path
modules
within
loaded
file
//
ie
requiring
/some
inside
file
/a/bjs
needs
to
be
resolved
to
/a/some
var
resolveModule
=
function(module)
{
if
(modulecharAt(0)
!==
'')
return
module;
return
pathresolve(pathdirname(filePath),
module);
};
var
exports
=
{};
var
context
=
{
require:
function(name)
{
return
mocks[name]
||
require(resolveModule(name));
},
console:
console,
exports:
exports,
module:
{
exports:
exports
}
};
vmrunInNewContext(fsreadFileSync(filePath),
context);
return
context;
};
你也可以在
这里
下载代码片段

虽然在不是在文章发布最多的代码,
他仍然可以使用一些解释
当我们测试时,
我们要加载这个模块进入测试,
使用theloadModulefunction代替ofrequire加载模块测试
第一个参数filePath指定了我们要测试模型的查找位置。第二个参数mocks包含一个对象,对象的属性名称要和我们尝试require的模型的名称相匹配。那些属性指定的值就是伪对象,用来代替一般被require的模型。
本质上看就是用vm来加载和运行模型在另一个上下文中。换句话说,我们重建了全局变量(例如require和exports)以便我们能控制它们。需要注意的是我们编写了一个可用的新require函数。所做一切就是检查一下用执行的名字是否有一个模拟的依赖,如果每日有,我就就把它委托给那个常用的require函数。
使用模块加载器的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
fs
=
require('fs');
moduleexports
=
{
//
Do
something
with
`fs`
}
想象一下这个很酷,对吗?不管怎样,现在我们测试那个模块,但是我们要模拟fs来看看它是怎么在内部使用的。
//
Jasmine's
syntax
>简介:美世是一家全球领先的咨询公司,提供咨询、外包和投资服务,拥有超过25000名全球客户。美世顾问帮助客户最大限度的提高其员工健康、福利和退休计划的绩效,并在管理成本的同时优化劳动力表现。美世还提供客户化管理、技术和总体福利外包解决方案。美世的投资服务包括全球领先的投资咨询、退休计划的设计和管理以及多管理人的投资管理。美世拥有超过17000名雇员,分布于40多个国家,形成全球网络,确保提供给客户整合的全球解决方案,满足其希望建立全球策略和程序的愿望,同时允许灵活性,以适应当地文化、法律和监管要求。我们在当地的专业人士也可以为中型企业服务并解决具体国家的问题和机遇。该公司是Marsh&McLennanCompanies,Inc的全资子公司,后者已在纽约、芝加哥和伦敦的证券交易所上市,股票代码:MMC。美世于1995年进入中国,目前在北京、上海、广州、深圳、南京、大连、香港和台湾设有8家分支机构,咨询顾问超过350人。美世的顾问具备超过10年的在华咨询经验,在中国拥有超过3,000多家大型客户。美世通过与国有、民营及上市企业广泛的合作,在业内积累了极高的声誉。MerceristhegloballeaderfortrustedHRandrelatedfinancialadvice,productsandservicesInourworkwithclients,wemakeapositiveimpactontheworldeverydayWedothisbyenhancingthefinancialandretirementsecurity,health,productivityandemploymentrelationshipsoftheglobalworkforceMercerhasmorethan15,000employeesservingclientsinover180citiesand41countriesandterritoriesworldwideAsawhollyownedsubsidiaryofMarsh&McLennanCompanies,Inc,wecanalsoprovideaccesstothecomplementaryservicesofoursiblingcompanies,Marsh,Kroll,GuyCarpenterandOliverWymanPleaseapplybyconfidentialemailtocareerssh@mercercom,attentiontotheHumanResourcesManagerwithfullresume
法定代表人:李兆琦
成立日期:2000-09-29
注册资本:1900万美元
所属地区:上海市
统一社会信用代码:913100006074219958
经营状态:存续(在营、开业、在册)
所属行业:租赁和商务服务业
公司类型:有限责任公司(外国法人独资)
英文名:Mercer Consulting (China) Co, Ltd
人员规模:100-499人
企业地址:上海市黄浦区九江路660-686号13楼A、C、D室
经营范围:企业管理咨询,投资咨询,商务信息咨询,经济信息咨询,市场营销策划,科技信息咨询;企业员工内部培训,人力资源方案策划及软件开发与销售自产产品;以服务外包方式从事员工工资、税收、福利的数据及相关信息处理;员工福利代理,食品流通,日用百货,工艺品(文物除外),办公用品,文体用品,健身器材,电子产品,通讯器材及配件,家用电器,家庭用品,服装服饰,鞋帽箱包,玩具,钟表的批发、进出口、佣金代理(拍卖除外),并提供相关的配套服务(不涉及国营贸易管理商品,涉及配额、许可证管理的商品,按国家有关规定办理申请),电子产品、医疗设备的研发,网络科技领域内的技术服务、技术开发、技术咨询、技术转让。依法须经批准的项目,经相关部门批准后方可开展经营活动

各种密码明细单
上海新时达F5021:01234 06666 08888 09999 12588 91110 19163(高级密码)
(企业级密码在参数F39内、F40是设置运行次数、可设置时间或次数);DIAO-5000(新时达F5021板)用专用协议软件、但需设置为小写(e)。
S8一体机(星玛电梯)(多摩川编码器时)F223设10010、编码器类型选3或4、
(海德汉编码器时)F233设10000、
无锡中秀韦伯CAN3000、3000B:012345无锡中秀的WECAN-3000是123456 、板子通讯波特率设置(1)外呼显示、D16或D0、(2)01D通讯板P18第一排针脚短接是低波特率、拿掉是高波特率。
(解密方法:1、运行次数除以7的平方加除不尽的余数或不加余数;2、将纽扣电池拿掉、过一晚后装上去就恢复出厂时数字)
沈阳蓝光BL2000:9898 4343 0000 1234 1010 1111 4848、蓝光主板运行次数设定方法是先把电梯检修然后输入高级密码9898然后再进入SPECIAL PARA ENTER 里的RUN STOP TIMER 里自己修改自己想要的运行次数最高是9999次设定好后确定 然后再到SAVE PARA ENTER里保存就可以了
苏州默纳克nice3000:012345;F9-10为时间天数、以8天为基数、F9-08也可设置但为什么暂时不明、新宁崀新宾馆密码00319
德国奔克的:5061 5060(长沙枫树园基本菜单0319、服务菜单6688)
厦门汉京HK2000-A2/ *** 作及监控/使用功能管理/人员身份/(4为快意电梯密码)
西奥AMCB2:1234
米高3000;99668 99887
富士变频器密码:2191
松下门机控制器:P08设2(端子控制),P09设4(4个位置开关方式),1是编码器方式、3是编码器方式门宽学习;P43(输入信号逻辑设定)设27(根据常闭为0、常开为1的原则;关到位1、开到位2、光幕4、关变速8、开变速16、依次二进制计算);D15-D20为开门频率、D22-D27为关门频率、D14为闭到达保持频率、D15为开到达保持频率;P41密码设定:按stop使门机停止、按4次mode键、变为密码输入显示PS、显示闪烁,按上或下键至密码值,按SET键就可显示参数;P42设为1时所有参数恢复出厂值。
三荣控制器:密码11111111进入、把运行使能由0改1、再把年(00010)、月(001)、日(012)设好、确认就ok。
项目名称及密码清单
1、 邵东-新马电梯、蓝光2000主板密码19800319
2、 安化-星玛电梯S8(新时达)一体机一级密码6699二级密码6688超级密码319


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13440880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-06
下一篇 2023-08-06

发表评论

登录后才能评论

评论列表(0条)

保存