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

时间:2017-03-22 01:21:51

标签: ruby-on-rails ruby rspec dry

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

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

2 个答案:

答案 0 :(得分:1)

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

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

require ENV['SHARED_EXAMPLE_FILE_PATH']

在您的spec文件中添加它,您应该可以调用它。

如果要加载多个文件,请确保要求rspec rails_helper.rbspec_helper.rb中的所有文件(如果您有旧版本))同时确保在文件之前加载它们使用它们(documentation)。

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 }
...

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

答案 1 :(得分:0)

恕我直言,我不认为RSpec支持这一点。但这可以像跨项目共享代码的问题一样接近。因此,如果您已经在组织中执行此操作,我会坚持使用该解决方案,以保持一致。否则,您可以尝试:

  1. 使用规范创建gem(例如PHP Fatal error: Class 'Doctrine\Common\Inflector\Inflector' not found in /vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php on line 78 [Symfony\Component\Debug\Exception\FatalErrorException] Class 'Doctrine\Common\Inflector\Inflector' not found )。需要宝石shared_specs中的规范文件,然后在每个应用程序的lib/shared_spec.rb中,在Gemfile中添加gem 'shared_specs', require: falserequire 'shared_specs'。但是,您希望在own gem server上发布gem。
  2. 使用SCM(gitsvnhg)子模块将规范从单独的存储库中提取到主要的spec/shared_specs.rb目录中。这需要熟悉SCM,并且流程可以be cumbersome
  3. 上述解决方案可减少重复,但会产生额外的维护开销 - 它们需要额外的基础架构,并且规范中的更新意味着更新每个应用程序。根据上下文(具有不同速度的分布式团队,具有基本相似但略有不同的规范要求的应用程序,少量应用程序,不频繁的规范更改),简单的副本和使用规范粘贴文件也可能有用。
  4. (每个选项都有一些假设,但是,我的SO分数太低,无法通过评论来澄清问题)。