【问题标题】:Do I need to test functions which I know their result? [closed]我是否需要测试我知道其结果的函数? [关闭]
【发布时间】:2022-01-05 11:50:42
【问题描述】:

我在UserService 类下有一些方法,这是我的ORM Prisma 的高级抽象。我这样做的原因是如果我决定使用另一个 ORM,我的应用程序的其余部分就不需要更改。比如这个方法创建一个用户(简化了)

export class UserService {
  async create(data: UserCreateInput) {
    return await this.prisma!.user.create({
      data: { ...data },
      select: selectUserFields(),
    });
  }
}

我的create 方法只是运行 Prisma 的 create 方法并返回输出。我在我的 create 方法中做了更多的事情,但最后,它返回了 Prisma 的 create 方法的结果。在测试中,我必须模拟 Prisma 的 create 方法的返回值,然后检查它是否是我指定的,这有点傻。

  it("should create a new user ", () => {
      mockPrisma.user.create.mockResolvedValue(defaultUser);
      expect(userService.create({ name: "jack" })).resolves.toEqual(defaultUser);
  });

即使是这个简单的测试也为我缓存了一些错误,比如忘记返回一个值,但我对它给我带来的好处并不满意。我不想花时间进行愚蠢的测试。

你觉得它也很傻还是我应该保留它?

【问题讨论】:

  • 我认为一些测试用例本质上是微不足道的,但是,彻底的测试很重要。所以,我建议你也应该添加更多的案例,比如传递错误的参数,来测试失败的案例。
  • 你必须知道(预期的)结果才能写出期望,所以标题没有多大意义。有时您的期望是错误的,或者后来的更改会破坏某些东西,在这些情况下,发现这一点很有用。

标签: node.js unit-testing jestjs


【解决方案1】:

这个问题的答案都将基于意见并相互矛盾,这可能意味着问题可能会被关闭。另外,很多聪明的人比我更能表达我的看法,很多聪明的人认为我错了……但话虽如此,我还是会尝试回答。


TL;DR 是的,保留它。如果您不想阅读数百万条关于什么是好的测试的相互矛盾的意见,请尽可能多地编写每个级别的测试,直到您比任何写博客的人都更清楚答案。如果您确实想了解很多人对这个问题的看法,我在这里为您准备了一份。


像拉里沃尔这样的人说过“我可以告诉你我是怎么做的,但我不能告诉你你是怎么做的。”

就我个人而言,我的目标是尽可能实现最高级别的 100% 测试覆盖率。 Jest 可以告诉你什么时候让线路不被覆盖。我会测试 API 端点(或为客户端安装组件)。
在这些情况下,我只会为单个功能编写测试,例如您在其中的功能:

  • 该函数涵盖了如此多的情况,以至于我无法或不想弄清楚如何通过调用 API 来调用它们。 日期格式化函数就是一个很好的例子。您的 API 可能依赖于系统日期或类似的东西,因此只能真正测试今天的日期或类似的东西,因此您可以使用大约 100 个样本日期来测试您的日期格式化程序。
  • 实际上很难弄清楚如何首先获得正确的功能..就像它有各种各样的ifelse||&&,你实际上首先从测试中受益(这类似于我曾经听到的 DHH 所说的“TDD 甜蜜点”之类的东西)
  • 没有办法通过高级测试获得 100% 的覆盖率。但我完全确定我需要特定的代码行,所以虽然我可以输入 /* istanbul ignore next */ 或其他东西并告诉覆盖系统,以及我的未来的自我,我没有测试那行代码,而是我只是通过编写一个“愚蠢”的测试来证明我的意思,就像你说的那样,并在我的代码中评论为什么它是必要的,以及现实世界的情况是因为某些原因,我的高级测试无法涵盖此代码。

您示例的另一方面是,很多人说您不需要测试外部系统和外部库,尤其是当它们著名且可靠时。然而,最大的危险不是 Prism 不能正常工作——而是你错误地使用它。在您的示例中,您使用的是 他们的 模拟......这很棒......因为你希望他们确保他们的模拟是他们库的足够好的表示,所以你知道你正在使用他们的库正确。如果您为外部库创建自己的模拟,它并不能真正证明任何事情,因为您的模拟可能反映了您对外部库如何工作的误解。

另外,如果您更新到下一个主要的 prism 版本,如果您需要更改包装方法,这可能会很快告诉您......这很棒。因此,如果您想忽略我写的所有其他内容,请为此进行愚蠢的测试。

最重要的是,如果您尽可能多地测试所有内容...您将很快对需要进行的测试有自己的答案,并且您自己的答案将与其他人的答案一样好。那我希望你回来回答这个问题。我会收藏它以防万一。

【讨论】:

  • 非常感谢@Alex028502 花时间写这篇文章。我很感激。我想我会保留测试。也许有一天我会回来写下我自己的看法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多