2010-12-09 39 views
143

使用添加的rspec-rails生成器來設置RSpec來測試Rails應用程序非常簡單。但是如何添加RSpec來測試開發中的gem? 我沒有使用珠寶商或此類工具。我只是使用Bundler(bundle gem my_gem)來設置新寶石的結構並手動編輯* .gemspec。 我還將s.add_development_dependency "rspec", ">= 2.0.0"添加到gemspec並做了bundle install設置RSpec來測試一個gem(不是Rails)

是否有一些不錯的教程接下來要做什麼來讓RSpec工作?

+0

我想我必須寫一個:-) ...至少有兩個寶石,已經很好地整合:行爲作爲標籤可以和acts_as_geocodable。 – Zardoz 2010-12-09 12:50:36

回答

238

我已經更新了這個答案,以配合當前的最佳實踐:

捆紮機支持創業板的發展非常完美。如果要創建一個寶石,你需要在你的Gemfile的唯一事情是這樣的:

source "https://rubygems.org" 
gemspec 

這告訴捆紮機看你gemspec文件中的依賴關係,當你運行bundle install

接下來,請確保RSpec是您的寶石的開發依賴項。編輯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 

前兩行告訴捆紮機加載您gemspec裏面只有寶石。當您在自己的機器上安裝自己的寶石時,這會強制您的規格使用您當前的代碼,而不是單獨安裝的版本。

創建規範,例如spec/foobar_spec.rb

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

可選:添加一個.rspec文件默認選項,並把它放在你的寶石的根路徑:

--color 
--format documentation 

最後:運行規範:

$ rspec spec/foobar_spec.rb 
+74

爲了公平起見,您應該調用RSpec的init命令來生成規範框架文件,而不必手動輸入它們。 這將確保與您正在使用的RSpec版本的兼容性: rspec --init ` – 2012-03-27 12:50:50

+9

`rspec --init`在我寫這個時不可用,但好點! – iain 2012-03-30 19:50:38

+0

其實我發現這樣做的,需要在規範幫手最好的辦法是這樣的: 需要「RubyGems的」 需要「捆綁/設置」 Bundler.require(:默認情況下,:發展) – mkon 2013-11-08 04:30:40

50

Iain的解決方案上面的工作很棒!

如果你也希望有一個Rake文件,這是所有你需要:

require 'rspec/core/rake_task' 

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

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

檢查的RDoc爲RakeTask對於您可以選擇進入任務定義的各種選項。

6

這裏是一個廉價和容易(雖然不是官方推薦的)方法:

讓你的寶石的根稱爲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文件,並把它放在你的寶石的根路徑。我看起來像這樣:

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

簡單,快速,整潔!

我喜歡這個,因爲你根本不需要添加任何依賴到你的項目,整個事情仍然非常快。 bundle exec稍微減慢了一些東西,這是你必須要做的,以確保你始終使用同一版本的rspec。運行兩次測試花費的0.56秒時間佔用了我的電腦加載rspec的時間99%。運行數百個規格應該非常快。你可能遇到的唯一問題是,如果你改變了rspec的版本,並且新版本不能與你在測試中使用的某個函數向後兼容,你可能不得不重新編寫一些測試。

如果你正在做一次性規範或者有一些很好的理由不在你的gemspec中包含rspec,這很好,但是它對啓用共享或強制兼容性並不是很好。