模拟node.js模块

可以说我有这种情况(架构)

layer1 -> layer2 -> layer3 

层只是正常的node.js模块(有一些导出的function)

Layer1需要layer2并调用其function,而layer2需要layer3并调用其function。

我想testinglayer1中的函数,但也模拟layer3(我在layer1中的函数调用传播到layer3,这个我想模拟)。

做这个的最好方式是什么? 我已经看过这个模块: https : //github.com/thlorenz/proxyquire,但我不认为它支持嘲笑当事情是深入2级或更多级别,如我的例子。

感谢您的任何build议!

我用嘲讽取得了巨大的成功,尽pipe取决于你想要嘲笑的东西,它会变得非常乏味。

不过,你的设置似乎有点古怪。 如果要unit testing第1层,则只需要模拟第2层,而第1层和第3层之间不应有任何(直接)连接。

其实我是错误的代理。 是的,你可以在你正在testing的原始模块下面2或更多的深度模拟一些模块,并且它们在他们的例子中performance得很好。 只要把存根与你正在嘲笑的模块的path。 如果你正在模拟layer3,stub的path必须和layer2中写入的layer3的path相同(所以它相对于layer2而不是layer1或某个根)。

我们正在进行集成testing,因为我们使用的是mongoDB数据库,并且没有mongo的embedded式数据库,所以我觉得这很糟糕。有一些尝试和替代方法,但是我看到它们不够好。 所以我的问题有一个根源,我们不得不嘲笑整个数据层。 在此之前,我们有一些机器上的真正的数据库和CI服务器上的集成testing(jenkins)使用的是真实的数据库,但这不是很好,因为你不能在你的笔记本电脑上运行testing。

所以嘲笑应用程序的整个数据层也是非常糟糕的解决scheme,但正如我所看到的,没有其他select。 如果有人有相同或相似的情况,请随时在这里写你的解决scheme。

而且我也想全局地投诉node.js模块。 社区真的很活跃,很多,但很多模块没有后向兼容性,甚至更糟的是其中有些模块不能很好地与其他模块互动。 例如,对于HTTP客户端,我们使用模块restler和新版本的节点,所以我们必须切换到restify,因为restler对新版本的节点不起作用。 但我们也用nock来嘲笑HTTP请求(真的很酷的模块btw)和BUMP – restify与nock不兼容…也许这是这个开源的,基于社区的技术的价格和node.js的快速开发