您需要对Rails做些什么才能使规范文件与它们所描述的代码共存



多年来,我一直遵循rails惯例,将规范文件放在规范文件夹中,并与它们描述的代码完全分离:

- app
- controllers
- application_controller.rb
- models
- user.rb
- spec
- controllers
- application_controller_spec.rb
- models
- user_spec.rb

然而,这种方法会带来很多不必要的错位和混乱,我真的很喜欢Angular将组件、它们的规范和代码放在一起的方法。在从事过大型rails项目后,规范和代码之间的错位可能会变得令人难以置信的困惑和迷失方向。

要做到这一点,需要做出哪些改变

我想在rails中做同样的事情,并将规范移动到它们描述的文件旁边,这样目录结构就更类似于这个:

- app
- controllers
- application_controller.rb
- application_controller_spec.rb
- models
- user.rb
- user_spec.rb

我需要改变什么才能让它发挥作用?

脑海中浮现的几件事是:

  • 确保Zeitwerk不会在应用程序加载时将规范文件加载到内存中
  • 调整guard以便监视正确的目录

我还需要什么?有什么特别需要注意的吗?

这可能是可能的,但可能并不实用。

首先,假设您使用的是rspec,那么您必须配置/覆盖测试套件期望查找规范文件的路径,这可能并不难做到,但如果您使用rspec(或任何其他测试套件(的任何扩展,则必须调整对规范路径的任何引用,以使规范正确运行,这可能会增加未来的维护工作。

您也可能失去使用生成器的能力,除非您在运行生成器时修补创建规范文件的类,因为默认情况下,它们会将规范文件放在spec/modelsspec/controllers等中。

覆盖这些类型的东西是可能的,但需要维护,并且可能被大多数Rails开发人员认为"不是Rails的方式"。Rails是一个固执己见的框架,也就是说,任何开发你的应用程序的开发人员几乎肯定会在默认情况下看到spec目录中的规范文件,所以你可能会受到未来团队成员的抵制。

可能还有其他问题,但这些只是首先想到的事情。

为什么要使用自动加载?由于您离框架的约定太远了,您可以简单地手动要求文件,并将rspec配置为仅在_spec.rb文件上运行。rspec ./app,你可以走了。

-

关于架构的注意事项:

鲍勃·马丁在他的书中指出;Clean Architecture";测试可以被视为系统的最外层。他们在那里是为了保证它正常工作,但绝对没有什么取决于他们。改变整个项目的结构,将其绑定到一个web框架,将其与另一个web架构的约定绑定,对我来说并没有太大吸引力

以下是他为rails社区发表的一篇相当古老的演讲,涉及的话题如下:https://www.youtube.com/watch?v=WpkDN78P884

https://github.com/RailsEventStore/cqrs-es-sample-with-res

RailsEventStore组织的这个示例应用程序提供了一个如何进行的示例,尽管它使用了迷你测试而不是rspec,但理论上它应该适用于rspec。

它提供了一个在顶级使用/ordering对逻辑进行分组的示例。为此,它使用/ordering/test/来存储测试。它包括一个测试助手,它基本上只是加载可以包含在常规测试助手中的东西。所以对于rspec,我想它会是这样的:

# rails_root/something/rspec/spec_helper.rb
require_relative '../../rspec/rspec_helper' # Load the standard rspec helper

这允许您继续使用标准/rspec模式,同时还可以让高级模块(即:有界上下文(包含自己的规范。

尽管事实上,我认为就你的情况而言,这可能是一种糟糕的做法。做下面这样的事情可能更有意义,尽管即使这样也不是很理想,因为你添加了重复的spec_helpers,而且这样分组除了在某些情况下查找规范稍微快一点之外,真的没有实际好处。

- app
- controllers
- application_controller.rb
- specs
- application_controller_spec.rb
- spec_helper.rb
- models
- user.rb
- specs
- user_spec.rb
- spec_helper.rb

您可以通过rspec app/models/specs运行模型规格。

最新更新