如何更好地构建 Jasmine 单元测试,使它们不会出现在一个巨大的文件中?

Posted

技术标签:

【中文标题】如何更好地构建 Jasmine 单元测试,使它们不会出现在一个巨大的文件中?【英文标题】:How to better structure Jasmine unit tests such that they don't end up in a huge file? 【发布时间】:2019-08-19 00:28:01 【问题描述】:

我想确保我的单元测试可读且可维护,而不是将我的组件(或类)的所有测试转储到一个文件中,因为这似乎是目前的“最佳实践”。我认为这种做法对除了琐碎的代码或组件之外的任何东西都是有害的,并且它可能成为我所见过的所有 JS / TS 代码库中的负面力量。

我自己不是前端开发人员,我正在努力寻找或寻找更好的替代方案,但到目前为止,解决“胖测试文件”问题的唯一选择是为每个组件/服务创建一个 specs 文件夹,并且:

为每个方法创建一个测试文件

为每个描述“上下文”创建一个测试文件

当需要通用状态或设置时,我可以创建一个“帮助”服务或其他一些可以从需要它的测试中调用的通用功能。

这是否被认为是一种可接受的方法,或者这个问题在最佳实践方面仍未真正确立?

【问题讨论】:

【参考方案1】:

换个角度看问题:为什么你的测试如此繁重?

根据the style guide,您应该考虑将文件限制为 400 行代码。

删除样板、导入和空格,这相当于大约 300 行代码。您的 ng 功能是否仅限于此?

如链接中所述,您应该依赖于一的规则,它基本上表明您的功能应该有一个单一的责任。您的功能是否遵循该规则?

除此之外,假设您遵循这些规则并且仍然有大量测试文件,有几种解决方案可以减少测试所需的代码量:

对于模拟,您可以在 ng 功能的同一文件夹中创建一个单独的文件 您可以将测试拆分为多个文件,每个文件专门用于特定任务(***.ui.spec.ts***.http.spec.ts ...) 您还可以将测试代码分解为类/常量,以使其可重用

最后,

但到目前为止,解决“胖测试文件”问题的唯一选择是为每个组件/服务创建一个规范文件夹

错了。根据style guide,

为了有效地工作,您必须能够快速找到文件,尤其是当您不知道(或不记得)文件名时。将相关文件彼此靠近放在一个直观的位置可以节省时间。描述性文件夹结构对您和您之后的人来说是一个不同的世界

您应该将测试文件放在其功能旁边。

【讨论】:

谢谢,但您最后的报价直接与您的建议相矛盾并支持我的建议。规范文件是 (1) 描述性的, (2) 将相关文件放在一起, (3) 将相关文件聚集在一个直观的位置。如果您还需要包含模拟文件,那么对于规范文件夹来说这是一个更有力的论据,不是吗?否则,您最终会得到一个用于组件的 .ts / .html / .scss 文件,外加 10 个用于测试和模拟的文件。 我当然喜欢按任务拆分文件,我需要对此进行探索。一般来说,我见过的几乎每一个 jasmine 测试(我什至在 github 上查看了 Angular 项目中的 许多 个随机规范文件)在原则(例如 SOLID)方面都是一场彻底的灾难,但尤其是在大小和可读性方面。为什么会发生这种情况我不知道,而且我不认为所有情况都有一个原因。这可能是普遍缺乏(前端)单元测试经验和工具(Jasmine)出现尴尬和冗长的组合,除了最微不足道的测试用例。 ...当然还有糟糕的组件设计,这导致该组件需要进行许多测试。但同样,即使对于一些相对简单的组件,您最终也会得到难以导航的大型测试文件。 @Rombix 您可以根据需要创建一个规范文件夹在同一文件夹中,但我没有从您的评论中得到,我得到的是您有一个spec 文件夹就像你有一个 src 文件夹,我弄错了吗? 哦,我现在明白了!是的,我的意思是在与组件相同的文件夹中,而不是单独的项目范围的规范文件夹。我们在同一页上。

以上是关于如何更好地构建 Jasmine 单元测试,使它们不会出现在一个巨大的文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地测试(单元测试)独立于 WL 应用程序的 WL 适配器? + Jasmine 测试:不能使用“in”运算符在 null 中搜索“SUPPORT_COOKIES”

在 Jasmine 单元测试中模拟 AngularJS 模块依赖项

如何在 Android 上更好地对 Looper 和 Handler 代码进行单元测试?

如何在 jasmine 中编写单元测试用例?

如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?

AngularJS – 如何在 Jasmine 中为输入事件指令编写单元测试