用Jest模拟间接依赖

时间:2020-05-17 16:46:19

标签: node.js unit-testing mocking jestjs

我是Jest和单元测试的新手,我不确定在调用结构相对较深的情况下如何处理模拟。假设我们具有以下应用程序结构:

enter image description here

鉴于灰色类(axioscache)是外部的第三方模块,我需要为Domain.createUserBackend.postUsers方法编写单元测试。

我很清楚,在Backend.postUser测试中,我需要模拟axios

在使用Domain.createUser的情况下,我当然会嘲笑cache,但不确定如何处理其第二个依赖项。

我应该只是嘲笑Backend.postUser(作为直接依赖项)还是以某种方式间接嘲笑axios(作为外部依赖性)?

还是两种方法都可以在不同的设置下工作?

如果是这样,我应该使用什么标准来决定什么是最佳策略?

1 个答案:

答案 0 :(得分:2)

单元测试全部与单元有关。目的是发现缺陷,并验证可单独测试的软件单元的功能。通常,单元测试是与系统的其余部分隔离进行的,这意味着单元的所有依赖关系都是模拟的。

单位的大小完全取决于您。如果您在测试axios时决定模拟Domain.createUser,则您的单位是Domain.createUserBackend.postUser的组合。如果您模拟Backend.postUser,则会将单位减少到Domain.createUser。您甚至可以决定不进行任何模拟,从而增加整个系统的单元大小。

但是,覆盖整个系统的单元测试并没有说太多。如果单元测试失败,则您唯一知道的是系统中存在错误。没有迹象表明系统中可能存在的位置。如果单位要小得多,例如只有一个功能,则查找错误会容易得多。因此,在实践中,您开始为最小的可测试组件编写单元测试。

在您的问题中,您声明要测试Domain.createUser,因此将成为您的单元。应该模拟该单元的所有依赖项,因此您将模拟Backend.postUser,它将在另一个测试中进行测试。

如果出于某种原因无法分别测试Backend.postUser,则最好在一个单元中一起测试Domain.createUserBackend.postUser。然后,您将仅模拟cacheaxios,因为它们是该单元的直接依赖项。但是通常最好分别进行测试。