将Rspec共享示例组打包为Gem

时间:2012-01-08 09:06:33

标签: ruby-on-rails ruby rspec gem

我为Rspec创建了几个共享示例组,我想在其他应用程序中重用它们。实现这一目标的最佳方法似乎是将这些包装成宝石。但是我似乎无法找到一个很好的指导来帮助我入门。有几种不同的方法可以实现这一点,我读过的所有指南看起来都可能已经过时了。任何人都可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

必要的知识

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

他们最终只是一个.gemspec文件和对paths和依赖关系的理解(如果你依赖其他宝石,你只需要知道),尽管人们确实希望你遵循某些惯例。

我见过的最佳演练是guides

对于惯例,指南有一个很好的列表here,而packaging standard也非常棒。

进一步的想法

这些天,当我想制作一个宝石时,我开始使用Bundler(我更喜欢锄头/新宝石/珠宝商/等......)。 This Railscast介绍了如何做到这一点。现在,Bundler会假设你知道我所做的各种事情(git,bundler,rake),所以它不会再让我感到烦恼,但从前有太多了。

事情的简单事实是你不需要Bundler(将来,如果你有依赖并想要维护你的宝石,那么它会让你的生活更轻松,但现在你不需要它) 。如果你还不理解它,你就不需要git或任何版本控制(尽管如此,把它放在你的容忍列表中)。而且你不需要rake(它只是一个常用任务的CLI,但如果你不理解它正在做的所有垃圾,你不需要它,你可以直接用rspec二进制文件进行测试,你可以使用gem二进制文件直接打包您的宝石,您可以自己管理.gemspec,而不是让Rake为您生成等等。)

诀窍是根据您实际希望他们为您做的事情,将您所有这些工具的功能分开。当你不知道他们是如何工作/他们做什么时,这可能会很棘手,因为他们想要做所有事情。我能够通过使用一个名为gem this的非常简单的工具来克服这种无知,这个工具在我上次使用时有点过时了,但最终的结果就像你能得到的一样简单。 Here是作者的精彩视频。

答案 1 :(得分:0)

spec/shared/foo.rb

中创建共享示例
RSpec.shared_examples 'a foo class' do
...
end

require宝石spec/spec_helper.rb中的文件,以便您可以在宝石的测试规范中使用

现在让示例可用于安装gem的项目,您需要将它们添加到gemspec文件

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的最终安装路径是未知的。

if ENV['RAILS_ENV'] == 'test'
  require File.expand_path('../spec/shared/foo.rb', __dir__)
end

现在,在rails项目上安装gem之后,您可以在测试中可靠地使用共享示例。 (假设在gemfile中的测试环境中允许使用gem)

RSpec.describe FKlass do
  subject { described_class }

  it_behaves_like 'a foo class'
end