多年来,我一直遵循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/models
、spec/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
运行模型规格。