如何在多个应用程序之间共享 rspec 示例?



我有一堆需要运行相同 rspec 示例的 Rails 应用程序。这些规范是关于在整个组织中强制实施一致的约定。我熟悉 Rspec 的shared_example,但是 AFAIK,它们只能在同一应用程序中共享。

有没有办法在多个应用程序之间共享 rspec。如果有帮助,所有应用程序都共享一个 Rails 引擎。

您需要使用full_path要求共享文件(您可以使用 ENV 变量设置此路径):

require '/home/USERNAME/shared_examples/my_shared_specs.rb'

require ENV['SHARED_EXAMPLE_FILE_PATH']

将其添加到您的规范文件中,您应该能够调用它。

如果要加载多个文件,请确保要求 rspecrails_helper.rb中的所有文件(如果您有旧版本,spec_helper.rb)还要确保在使用它们的文件之前加载它们(文档)。

rails_helper.rb

...
Dir['/home/USERNAME/shared_examples/*.rb'].each { |file| require file }
...

...
Dir["#{ ENV['SHARED_EXAMPLES_PATH'] }*.rb"].each { |file| require file }
...

只要确保你把我用过的路径替换为你拥有的路径。

另一个更复杂的是仅使用共享示例创建一个 gem,并且再次在您的rails_helper.rb中需要这些文件:

...
Dir["#{Bundler.load.specs.find{|s| s.name == <gem_name> }.full_gem_path}/shared_examples_path/*.rb"].each { |file| require file }
...

这可能是宝石中的一种方法。

恕我直言,我认为 RSpec 不支持这一点。但这可以像跨项目共享代码的问题一样处理。因此,如果你已经在你的组织中这样做了,我会坚持这个解决方案,以保持一致。否则,您可以尝试:

  1. 创建宝石(例如shared_specs) 与规格。需要 gemlib/shared_spec.rb中的规范文件,然后在每个应用程序的Gemfile中添加gem 'shared_specs', require: false并在spec/shared_specs.rb中添加require 'shared_specs'。但是,您需要在自己的 Gem 服务器上发布 Gem。
  2. 使用 SCM(git、svn、hg)子模块将规范从单独的存储库拉入主存储库的spec目录中。这需要熟悉 SCM,并且该过程可能很麻烦。
  3. 上述解决方案减少了重复,但会产生额外的维护开销 - 它们需要额外的基础设施,规范中的更新意味着更新每个应用程序。根据上下文(具有不同节奏的分布式团队,具有基本相似但略有不同的规范要求的应用程序,应用程序数量较少,规范更改不频繁),使用规范文件的简单复制和粘贴也可能有效。

(每个选项都做出一定的假设,但是,我的SO点太低,无法通过评论提出澄清问题)。

最新更新