模拟node.js模块

时间:2013-07-05 09:04:20

标签: javascript node.js unit-testing mocking integration-testing

让我说我有这种情况(架构)

layer1 -> layer2 -> layer3

图层只是普通的node.js模块(有一些导出的函数)

Layer1需要layer2并调用他的函数,layer2需要layer3并调用他的函数。

我想测试layer1中的函数,还要模拟layer3(我在layer1中的函数调用传播到了layer3,这个我想模拟)。

最好的方法是什么? 我已经看过这个模块:https://github.com/thlorenz/proxyquire但我不认为它支持模拟当事情进展到2级或更高级别时,就像我的例子一样。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

我已经使用mockery取得了巨大的成功,尽管根据你想要模拟的东西它可能变得非常乏味。

但是,你的设置似乎有点古怪。如果要单元测试第1层,则只需要模拟第2层,并且第1层和第3层之间不应存在任何(直接)连接。

答案 1 :(得分:1)

其实我对proxyquire错了。是的,您可以在正在测试的原始模块下方2个或更多深度模拟某个模块,并且它们在示例中显示正常。只需将存根与您正在嘲笑的模块放在一起。如果要模拟layer3,则stub的路径必须与layer2中写入的layer3的路径相同(因此它相对于layer2,而不是layer1或某个root)。

我们正在进行集成测试,它很糟糕,因为我们使用的是mongoDB数据库而且mongo没有嵌入式数据库...有一些尝试和替代方案,但我认为它们还不够好。所以我的问题有根源,我们不得不模拟整个数据层。 在此之前,我们在某些机器上有真正的数据库,并且CI服务器上的集成测试(Jenkins)正在使用该真实数据库,但这并不是很好,因为您无法在笔记本电脑上运行测试。

因此,模拟应用程序的整个数据层也是非常糟糕的解决方案,但正如我所看到的那样,没有其他选择。如果有人有相同或类似的情况,请随时在此处编写您的解决方案。

我还想全局抱怨node.js模块。社区非常活跃且规模很大但很多模块没有向后兼容性,更糟糕的是其中一些模块没有很好地与其他模块交互。例如,对于HTTP客户端,我们使用模块restler和新版本的节点,我们必须切换到restify,因为restler对于新版本的节点不能很好地工作。但是我们也使用nock来模拟HTTP请求(非常酷的模块顺便说一句)和BUMP - restify与nock不兼容...也许这是这个开源,基于社区的技术的价格和node.js的快速开发