我有一堆需要运行相同 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 不支持这一点。但这可以像跨项目共享代码的问题一样处理。因此,如果你已经在你的组织中这样做了,我会坚持这个解决方案,以保持一致。否则,您可以尝试:
- 创建宝石(例如
shared_specs
) 与规格。需要 gemlib/shared_spec.rb
中的规范文件,然后在每个应用程序的Gemfile
中添加gem 'shared_specs', require: false
并在spec/shared_specs.rb
中添加require 'shared_specs'
。但是,您需要在自己的 Gem 服务器上发布 Gem。 - 使用 SCM(git、svn、hg)子模块将规范从单独的存储库拉入主存储库的
spec
目录中。这需要熟悉 SCM,并且该过程可能很麻烦。 - 上述解决方案减少了重复,但会产生额外的维护开销 - 它们需要额外的基础设施,规范中的更新意味着更新每个应用程序。根据上下文(具有不同节奏的分布式团队,具有基本相似但略有不同的规范要求的应用程序,应用程序数量较少,规范更改不频繁),使用规范文件的简单复制和粘贴也可能有效。
(每个选项都做出一定的假设,但是,我的SO点太低,无法通过评论提出澄清问题)。