【发布时间】:2012-01-08 09:06:32
【问题描述】:
我为 Rspec 创建了几个共享示例组,我想在其他应用程序中重复使用它们。实现这一点的最佳方法似乎是将它们打包成一个 gem。但是,我似乎找不到一个好的指南来帮助我入门。有几种不同的方法可以做到这一点,而且我读过的所有指南看起来都可能已经过时了。谁能指出我正确的方向?
【问题讨论】:
标签: ruby-on-rails ruby rspec gem
我为 Rspec 创建了几个共享示例组,我想在其他应用程序中重复使用它们。实现这一点的最佳方法似乎是将它们打包成一个 gem。但是,我似乎找不到一个好的指南来帮助我入门。有几种不同的方法可以做到这一点,而且我读过的所有指南看起来都可能已经过时了。谁能指出我正确的方向?
【问题讨论】:
标签: ruby-on-rails ruby rspec gem
Gems 非常简单,但在很长一段时间内,文档方面都存在巨大的空白。幸运的是,情况不再如此。
它们最终只不过是一个.gemspec 文件以及对paths 和依赖项的理解(如果您依赖其他gem,您只需要知道这些),尽管人们确实希望您遵循某些约定。
我见过的最好的演练是在guides。
对于约定,指南有一个很好的列表here,packaging standard 也非常棒。
这些天来,当我想制作宝石时,我从 Bundler 开始(我更喜欢 hoe/new gem/jeweler/etc...)。 This Railscast 介绍了如何做到这一点。现在,Bundler 会假设你知道我所做的各种东西(git、bundler、rake),所以它不再困扰我了,但从前它太多了。
简单的事实是您不需要 Bundler(将来,如果您有依赖项并想维护您的 gem,那么它会让您的生活更轻松,但现在您不需要它) .如果你还不理解它,你不需要 git 或任何版本控制(不过,把它放在你的 tolearn 列表中)。而且你不需要 rake(它只是一个 CLI 来处理常见任务,但如果你不了解它所做的所有废话,你就不需要它,你可以直接用 rspec 二进制文件进行测试,你可以打包您可以直接使用 gem 二进制文件来管理您的 gem,您可以自己管理您的 .gemspec,而不是让 Rake 为您生成它等)。
诀窍是将所有这些工具为您做的事情与您真正希望它们为您做的事情分开。当您不知道他们如何工作/他们做什么时,这可能会很棘手,因为他们想做所有事情。通过使用一个名为gem this 的非常简单的工具,我能够克服这种无知,我上次使用它时有点过时,但最终还是尽可能简单。 Here 是作者的精彩视频。
【讨论】:
在spec/shared/foo.rb创建一个共享示例
RSpec.shared_examples 'a foo class' do
...
end
require gem 中的文件 spec/spec_helper.rb 以便您可以在 gem 的测试规范中使用它
现在要将示例提供给安装 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 的最终安装路径对于 gem 是未知的。
if ENV['RAILS_ENV'] == 'test'
require File.expand_path('../spec/shared/foo.rb', __dir__)
end
现在,在您的 rails 项目上安装 gem 后,您可以在测试中可靠地使用共享示例。 (假设 gem 文件中的测试环境允许使用 gem)
RSpec.describe FKlass do
subject { described_class }
it_behaves_like 'a foo class'
end
【讨论】: