160

使用添加的 rspec-rails 生成器来设置 RSpec 以测试 Rails 应用程序非常容易。但是添加 RSpec 来测试开发中的 gem 怎么样?我没有使用珠宝商或此类工具。我只是使用 Bundler ( bundle gem my_gem) 来设置新 gem 的结构并手动编辑 *.gemspec。我还添加s.add_development_dependency "rspec", ">= 2.0.0"到 gemspec 并做了一个bundle install.

是否有一些不错的教程可以让 RSpec 正常工作?

4

4 回答 4

261

我已经更新了这个答案以匹配当前的最佳实践:

Bundler 完美支持 gem 开发。如果你正在创建一个 gem,你的 Gemfile 中唯一需要的就是以下内容:

source "https://rubygems.org"
gemspec

这告诉 Bundler 在您运行时在 gemspec 文件中查找依赖项bundle install

接下来,确保 RSpec 是您的 gem 的开发依赖项。编辑 gemspec,使其显示为:

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 只加载 gemspec 中的 gem。当您在自己的机器上安装自己的 gem 时,这将强制您的规范使用您当前的代码,而不是您单独安装的版本。

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

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

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

--color
--format documentation

最后:运行规范:

$ rspec spec/foobar_spec.rb
于 2010-12-09T19:23:52.870 回答
53

伊恩的上述解决方案效果很好!

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

require 'rspec/core/rake_task'

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

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

检查RakeTask的 RDoc 以了解您可以选择传递到任务定义中的各种选项。

于 2011-01-08T03:38:45.940 回答
27

您可以通过运行 rspec 生成新的 gem bundler gem --test=rspec my_gem。无需额外设置!

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

于 2014-07-19T21:50:49.747 回答
7

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

在您的 gem 的根目录中创建一个名为 的目录spec,将您的规格放在那里。您可能已经安装了 rspec,但如果您没有安装,只需执行 agem 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,这很好,但是它对于启用共享或强制兼容性不是很好。

于 2012-03-17T20:52:54.610 回答