设置RSpec来testing一个gem(不是Rails)

使用rspec-rails的添加生成器来设置RSpec来testingRails应用程序非常简单。 但是如何添加RSpec来testing开发中的gem? 我不使用珠宝商或这样的工具。 我只是使用Bundler( bundle gem my_gem )来设置新gem的结构并手动编辑* .gemspec。 我还添加了s.add_development_dependency "rspec", ">= 2.0.0" gemspec并做了一个bundle install

有没有一些好的教程接下来做什么RSpec工作?

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

Bundler支持完美的gem发展。 如果你正在创build一个gem,你需要在Gemfile中唯一的东西是:

 source "https://rubygems.org" gemspec 

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

接下来,确保RSpec是你的gem的开发依赖。 编辑gemspec,使其如下所示:

 spec.add_development_dependency "rspec" 

接下来,创buildspec/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中的gems。 当您在自己的机器上安装自己的gem时,这会强制您的规格使用您当前的代码,而不是您单独安装的版本。

创build一个spec,例如spec/foobar_spec.rb

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

可选:为默认选项添加.rspec文件,并将其放入您的gem根path中:

 --color --format documentation 

最后:运行规格:

 $ rspec spec/foobar_spec.rb 

上面Iain的解决scheme很好!

如果你还想要一个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, 以获取可以select传入任务定义的各种选项。

你可以使用rspec通过运行bundler gem --test=rspec my_gem来生成新的gem。 没有额外的安装!

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

这是一个便宜而简单的(虽然不是正式推荐)的方式:

制作一个名为specgem根目录,把你的规格放在那里。 你可能已经安装了rspec,但如果你不这样做,只要做一个gem install rspec ,忘记Gemfiles和bundler。

接下来,您将制定一个规范,并且您需要告诉它您的应用程序在哪里,您的文件在哪里,并且包含您要testing的文件(以及它所具有的任何依赖项):

 # 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 

打开terminal并运行rspec:

 ~/awesome_gem $ rspec .. Finished in 0.56 seconds 2 examples, 0 failures 

如果你想要一些.rspec选项,可以创build一个.rspec文件,并把它放在你的gem根path中。 我看起来像这样:

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

简单,快速,整洁!

我喜欢这个,因为你根本不需要添加任何依赖到你的项目,整个事情仍然非常快。 bundle exec会降低一点,这是你必须要做的,以确保你始终使用相同版本的rspec。 运行两次testing花费的0.56秒,在我的电脑加载rspec的时间里占用了99%的时间。 运行数百个规格应该是非常快的。 你可能遇到的唯一的问题是,如果你改变了rspec的版本,并且新版本不能与你在testing中使用的某个函数向后兼容,你可能需要重新编写一些testing。

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