【问题标题】:Mocking indirect dependencies with Jest用 Jest 模拟间接依赖
【发布时间】:2020-09-03 09:52:54
【问题描述】:

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

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

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

如果是Domain.createUser,我当然会模拟cache,但我不确定如何处理它的第二个依赖项。

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

或者两种方法都适用于不同的设置?

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

【问题讨论】:

  • 您在帖子中的最后一句话回答了您的问题。那么问题是什么?
  • @slideshowp2 谢谢,我确实想通了并稍微更新了测试。我实际上想知道我提到的两种方法是否都有意义(尤其是这种间接模拟)

标签: node.js unit-testing mocking jestjs


【解决方案1】:

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

单元的大小完全由您决定。如果您决定在测试Domain.createUser 时模拟axios,则您的单位是Domain.createUserBackend.postUser 的组合。如果您改为模拟Backend.postUser,则将您的单位减少到仅Domain.createUser。您甚至可以决定什么都不做,将单元的大小增加到整个系统。

但是,涵盖整个系统的单元测试并不能说明什么。如果单元测试失败,你唯一知道的就是你的系统有错误。没有迹象表明系统可能在哪里。如果单元更小,例如,单个函数,则搜索错误会容易得多。这就是为什么在实践中,您开始为最小的可测试组件编写单元测试。

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

如果由于某种原因无法单独测试Backend.postUser,最好在一个单元中同时测试Domain.createUserBackend.postUser。然后你将只模拟cacheaxios,因为它们是本单元的直接依赖项。但通常最好分别测试两者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2018-04-09
    • 2021-12-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多