我是Jest和单元测试的新手,我不确定在调用结构相对较深的情况下如何处理模拟。假设我们具有以下应用程序结构:
鉴于灰色类(axios
和cache
)是外部的第三方模块,我需要为Domain.createUser
和Backend.postUsers
方法编写单元测试。
我很清楚,在Backend.postUser
测试中,我需要模拟axios
。
在使用Domain.createUser
的情况下,我当然会嘲笑cache
,但不确定如何处理其第二个依赖项。
我应该只是嘲笑Backend.postUser
(作为直接依赖项)还是以某种方式间接嘲笑axios
(作为外部依赖性)?
还是两种方法都可以在不同的设置下工作?
如果是这样,我应该使用什么标准来决定什么是最佳策略?
答案 0 :(得分:2)
单元测试全部与单元有关。目的是发现缺陷,并验证可单独测试的软件单元的功能。通常,单元测试是与系统的其余部分隔离进行的,这意味着单元的所有依赖关系都是模拟的。
单位的大小完全取决于您。如果您在测试axios
时决定模拟Domain.createUser
,则您的单位是Domain.createUser
和Backend.postUser
的组合。如果您模拟Backend.postUser
,则会将单位减少到Domain.createUser
。您甚至可以决定不进行任何模拟,从而增加整个系统的单元大小。
但是,覆盖整个系统的单元测试并没有说太多。如果单元测试失败,则您唯一知道的是系统中存在错误。没有迹象表明系统中可能存在的位置。如果单位要小得多,例如只有一个功能,则查找错误会容易得多。因此,在实践中,您开始为最小的可测试组件编写单元测试。
在您的问题中,您声明要测试Domain.createUser
,因此将成为您的单元。应该模拟该单元的所有依赖项,因此您将模拟Backend.postUser
,它将在另一个测试中进行测试。
如果出于某种原因无法分别测试Backend.postUser
,则最好在一个单元中一起测试Domain.createUser
和Backend.postUser
。然后,您将仅模拟cache
和axios
,因为它们是该单元的直接依赖项。但是通常最好分别进行测试。