设置 RSpec 来测试 gem (而不是 Rails)

通过添加 RSpec-Rail 生成器,可以非常容易地设置 RSpec 来测试 Rails 应用程序。但是如何添加 RSpec 来测试开发中的 gem 呢? 我没有使用珠宝商或这样的工具。我只是使用 Bundler (bundle gem my_gem)为新 gem 设置结构并编辑 * 。手动检测。 我还将 s.add_development_dependency "rspec", ">= 2.0.0"添加到宝石规格,并做了 bundle install

是否有一些不错的教程下一步要做什么,让 RSpec 工作?

50100 次浏览

我更新了这个答案以符合当前的最佳实践:

Bundler 完美地支持 gem 开发。如果你正在创建一个 gem,你需要在你的 Gemfile 中包含 只有的内容如下:

source "https://rubygems.org"
gemspec

这告诉 Bundler 在运行 bundle install时查看 gemspec 文件中的依赖项。

接下来,确保 RSpec 是 gem 的开发依赖项:

spec.add_development_dependency "rspec"

接下来,创建 spec/spec_helper.rb并添加如下内容:

require 'bundler/setup'
Bundler.setup


require 'your_gem_name' # and any other gems you need


RSpec.configure do |config|
# some (optional) config here
end

前两行告诉 Bundler 只载入宝石规格中的宝石。当您在自己的机器上安装自己的 gem 时,这将强制您的 specs 使用当前代码,而不是您单独安装的版本。

创建一个规范,例如 spec/foobar_spec.rb:

require 'spec_helper'
describe Foobar do
pending "write it"
end

可选: 为默认选项添加一个 .rspec文件,并将其放在 gem 的根路径中:

--color
--format documentation

最后: 运行规格:

$ rspec spec/foobar_spec.rb

伊恩的上述解决方案工程伟大!

如果你也想要一个 Rakefile,这就是你所需要的:

require 'rspec/core/rake_task'


RSpec::Core::RakeTask.new(:spec)


# If you want to make this the default task
task default: :spec

检查 RDoc for RakeTask以获得可以选择传递到任务定义中的各种选项。

这里有一个便宜又简单的方法(虽然不是官方推荐的) :

在你的宝石的根目录中做一个名为 spec的目录,把你的规格放在那里。您可能已经安装了 Rspec,但是如果您没有安装,那么只需要执行 gem install rspec并忘记 Gemfiles 和 bundler。

接下来,你需要做一个规范,你需要告诉它你的应用程序在哪里,你的文件在哪里,并且包括你想要测试的文件(以及它所有的依赖关系) :

# spec/awesome_gem/awesome.rb
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
$: << File.join(APP_ROOT, 'lib/awesome_gem') # so rspec knows where your file could be
require 'some_file_in_the_above_dir' # this loads the class you want to test


describe AwesomeGem::Awesome do
before do
@dog = AwesomeGem::Awesome.new(name: 'woofer!')
end
it 'should have a name' do
@dog.name.should eq 'woofer!'
end
context '#lick_things' do
it 'should return the dog\'s name in a string' do
@dog.lick_things.should include 'woofer!:'
end
end
end

打开终端并运行 rspec:

~/awesome_gem $ rspec
..


Finished in 0.56 seconds
2 examples, 0 failures

如果你想要一些 .rspec选项,去做一个 .rspec文件,把它放在你的 gem 的根路径。我的是这样的:

# .rspec
--format documentation --color --debug --fail-fast

简单,快速,干净!

我喜欢这样,因为您根本不需要向项目添加任何依赖项,而且整个过程保持非常快。bundle exec稍微放慢了一些速度,这是确保始终使用相同版本的 rspec 所必须做的事情。运行两个测试所需的0.56秒在我的计算机加载 Rspec 时已经占用了99% 。运行数百个规格应该是非常快的。我注意到的唯一问题是,如果您更改了 rspec 的版本,而新版本不能向后兼容您在测试中使用的某些函数,那么您可能需要重新编写一些测试。

如果你正在做一次性的规格说明或者有一些好的理由不在你的 Gemspec 中包含 rspec,这是很好的,但是它对于启用共享或者强制兼容性不是很好。

您可以通过运行 bundler gem --test=rspec my_gem来使用 rspec 生成您的新 gem。不需要额外的安装!

我总是忘记这一点。它在这里实现: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36