Ruby on rails 将Rspec共享示例组打包为Gem

Ruby on rails 将Rspec共享示例组打包为Gem,ruby-on-rails,ruby,rspec,gem,Ruby On Rails,Ruby,Rspec,Gem,我已经为Rspec创建了几个共享示例组,我希望在其他应用程序中重用这些示例组。实现这一目标的最佳方法似乎是将其打包成宝石。然而,我似乎找不到一个好的指南让我开始。有几种不同的方法可以实现这一点,我读过的所有指南看起来都可能过时了。有人能给我指出正确的方向吗?必要的知识 Gems非常简单,但在很长一段时间内,文档方面存在巨大的空白。幸运的是,情况不再如此 它们最终只不过是一个文件,一种对文件和依赖关系的理解(如果您依赖其他gem,您只需要了解它们),尽管人们确实希望您遵循某些约定 我见过的最好的演

我已经为Rspec创建了几个共享示例组,我希望在其他应用程序中重用这些示例组。实现这一目标的最佳方法似乎是将其打包成宝石。然而,我似乎找不到一个好的指南让我开始。有几种不同的方法可以实现这一点,我读过的所有指南看起来都可能过时了。有人能给我指出正确的方向吗?

必要的知识 Gems非常简单,但在很长一段时间内,文档方面存在巨大的空白。幸运的是,情况不再如此

它们最终只不过是一个文件,一种对文件和依赖关系的理解(如果您依赖其他gem,您只需要了解它们),尽管人们确实希望您遵循某些约定

我见过的最好的演练是在

对于大会来说,指南有一个很好的列表,它也非常棒

进一步思考 这些天,当我想做宝石时,我从Bundler开始(我更喜欢Bundler而不是hoe/new gem/jeweler/等等)。Railscast介绍了如何做到这一点。现在,Bundler会假设你知道我所知道的所有东西(git、Bundler、rake),所以它不再困扰我了,但曾几何时它太多了

简单的事实是,你不需要Bundler(在将来,如果你有依赖关系并且想维护你的gem,那么它会让你的生活更轻松,但现在你不需要它)。如果您还不了解git或任何版本控制,那么您不需要git或任何版本控制(不过,请将其放在您的tolearn列表中)。而且你不需要rake(它只是一个普通任务的CLI,但是如果你不了解它所做的一切,你不需要它,你可以直接用二进制文件进行测试,你可以直接用二进制文件打包你的gems,你可以自己管理你的.gemspec,而不是让rake为你生成它,等等)


诀窍是将所有这些工具为您所做的与您实际希望它们为您所做的区分开来。当你不知道他们是如何工作/做什么的时候,这可能会很棘手,因为他们什么都想做。我能够通过使用一个非常简单的工具克服这种无知,该工具在我上次使用它时有点过时,但最终还是尽可能简单作者的视频很棒。

spec/shared/foo.rb

RSpec.shared_examples 'a foo class' do
...
end
require
gems
spec/spec\u helper.rb中的文件,以便您可以在gems的测试规范中使用它

现在,要使安装gem的项目能够使用该示例,您需要将它们添加到
gempec
文件中

Gem::Specification.new do |s|
 ...

 s.files         =  `git ls-files`.split("\n")
 s.files         += `git ls-files -- spec/shared/*.rb`.split("\n")
end
您还需要在测试环境中将其作为gem的一部分加载。这一点很重要,因为gem不知道gem的最终安装路径

if ENV['RAILS_ENV'] == 'test'
  require File.expand_path('../spec/shared/foo.rb', __dir__)
end
现在,在rails项目上安装gem之后,您可以在测试中可靠地使用共享示例。(假设gem文件中的测试环境中允许gem)


谢谢你的详细答复。这些是一些很棒的资源,我想他们已经让我有了75%的机会。然而,我不知道如何将我的共享示例组真正集成到gem中。我试图放置一个包含共享示例组的测试文件,在我的主项目中构建并要求使用我的gem,但RSpec找不到我创建的共享示例组。@helixed,如果您遵循,它将帮助您实现目标。这就是我需要的。谢谢你的帮助。
RSpec.describe FKlass do
  subject { described_class }

  it_behaves_like 'a foo class'
end