Gem'i test etmek için RSpec'i ayarlayın (Rails değil)


154

Rails uygulamasını test etmek için RSpec'i kurmak için eklenen rspec-ray jeneratörü ile oldukça kolaydır. Ama geliştirme aşamasında bir mücevher test etmek için RSpec eklemeye ne dersiniz? Kuyumcu ya da bu tür aletler kullanmıyorum. Ben sadece Bundler ( bundle gem my_gem) yeni taş yapısını kurmak ve * .gemspec el ile düzenlemek için kullandım. Ayrıca s.add_development_dependency "rspec", ">= 2.0.0"gemspec'e ekledim ve yaptım bundle install.

RSpec'in çalışmasını sağlamak için ne yapacağınız konusunda güzel bir eğitim var mı?


Sanırım bir tane yazmak zorundayım :-) ... En azından zaten güzelce bütünleştiren iki mücevher var: taarruz edilebilir gibi davranıyor ve act_as_geocodable.
Zardoz

Yanıtlar:


255

Bu yanıtı mevcut en iyi uygulamalarla eşleşecek şekilde güncelledim:

Bundler mücevher gelişimini mükemmel bir şekilde destekler. Bir mücevher oluşturuyorsanız , Gemfile'ınızda olması gereken tek şey şudur:

source "https://rubygems.org"
gemspec

Bu, Bundler'a çalıştırdığınızda bağımlılıkları bulmak için gemspec dosyanızın içine bakmasını söyler bundle install.

Şimdi, RSpec'in geminizin bir geliştirme bağımlılığı olduğundan emin olun. Gemspec'i aşağıdakileri okuyacak şekilde düzenleyin:

spec.add_development_dependency "rspec"

Ardından, aşağıdaki spec/spec_helper.rbgibi bir şey oluşturun ve ekleyin:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

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

İlk iki satır Bundler'a sadece değerli taşınızın içindeki taşları yüklemesini söyler. Kendi taşınızı kendi makinenize kurduğunuzda, bu özelliklerinizi ayrı olarak yüklediğiniz sürümü değil, geçerli kodunuzu kullanmaya zorlar.

Bir özellik oluşturun, örneğin spec/foobar_spec.rb:

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

İsteğe bağlı: .rspecvarsayılan seçenekler için bir dosya ekleyin ve geminizin kök yoluna yerleştirin:

--color
--format documentation

Son olarak: teknik özellikleri çalıştırın:

$ rspec spec/foobar_spec.rb

75
Adil olmak gerekirse, RSpec'in init komutunu manuel olarak yazmak yerine spesifik iskelet dosyalarını oluşturmak için rspec --init
çağırmalısınız

12
rspec --initBen bunu yazarken mevcut değildi, ama iyi bir nokta!
Iain

Aslında spec yardımcıda gerektirir yapmak için en iyi yolu buldum: 'rubygems' gerektirir 'bundler / kurulum' Bundler.require (: varsayılan,: geliştirme)
mkon

@ Mkon'un üç kod satırı, iain'in üç kod satırından tam olarak nasıl çalışır?
Nakilon

1
Mkon satırları geliştirme ve test gruplarındaki tüm taşlar gerektirirken, benim yaklaşım her mücevher elle gerektirir. Mücevher yaparken her gemiye ihtiyacınız olduğu için, biraz daha fazla iş olsa bile daha iyi / net bir yaklaşım olduğunu düşünüyorum.
Iain

53

Iain'nin yukarıdaki çözümü harika çalışıyor!

Ayrıca bir Rakefile istiyorsanız, ihtiyacınız olan tek şey budur:

require 'rspec/core/rake_task'

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

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

İsteğe bağlı olarak görev tanımına iletebileceğiniz çeşitli seçenekler için RDoc for RakeTask'a bakın.


26

Yeni taşınızı rspec ile çalıştırarak oluşturabilirsiniz bundler gem --test=rspec my_gem. Ek Kurulum Yok!

Bunu hep unuturum. Burada uygulanmaktadır: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
Temiz! Ancak, mücevher adınızı deve durumda yerine alt çizgi ile belirtilmesi gerektiğini düşünüyorum. Aksi takdirde Bundler büyük harfli dosyalar oluşturur (Bundler 1.7.4)
Malte

Bundler şikayet etti --test=rspec, ama yine de koştuğumda Rspec kullanmak isteyip istemediğimi sordu bundler gem my_gem.
Nicolas Mattia

7

İşte ucuz ve kolay (resmi olarak tavsiye edilmese de) bir yol:

Mücevher kök denilen bir dir yapmak, specoraya özellikleri koymak. Muhtemelen zaten rspec yüklüdür, ancak eğer yapmazsanız, sadece gem install rspecyapın ve Gemfiles ve bundler'ı unutun.

Ardından, bir spesifikasyon yapacaksınız ve uygulamanızın nerede olduğunu, dosyalarınızın nerede olduğunu ve test etmek istediğiniz dosyayı (sahip olduğu bağımlılıklarla birlikte) belirtmeniz gerekir:

# 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'i açın ve rspec'i çalıştırın:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Bazı .rspecseçeneklerin sevilmesini istiyorsanız , bir .rspecdosya yapın ve geminizin kök yoluna koyun. Benimki şöyle:

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

Kolay, hızlı, temiz!

Bunu sevdim çünkü projenize hiç bağımlılık eklemek zorunda değilsiniz ve her şey çok hızlı kalıyor. bundle execişleri biraz yavaşlatır, bu da rspec'in aynı sürümünü her zaman kullandığınızdan emin olmak için yapmanız gereken şeydir. İki testin çalıştırılması 0,56 saniye, bilgisayarımın rspec'i yüklemesi zamanına kadar% 99 oranında alındı. Yüzlerce teknik özellik çok hızlı olmalı. Farkına varabileceğiniz tek sorun, rspec sürümlerini değiştirirseniz ve yeni sürüm, testinizde kullandığınız bazı işlevlerle geriye dönük olarak uyumlu değilse, bazı testleri yeniden yazmanız gerekebilir.

Tek seferlik spesifikasyonlar yapıyorsanız veya gspspec'inize rspec'i dahil etmemek için iyi bir nedeniniz varsa, bu güzeldir, ancak paylaşımı veya uyumluluğu zorlamak için çok iyi değildir.


Bir test nesnesine başvurduğunuzda sınıf adlarından önce AwesomeGem :: ifadesini koymamın bir yolu var mı? Veya örneğinizdeki gibi yeni bir test oluşturduğunuzda.
Misha Slyusarev

1
Elbette, ya sınıf adınızı daha kısa bir şeye eşit olarak ayarlayabilir ya Thing = AwesomeGem::Awesomeda testi bir modül içinde yapabilirsiniz, örneğinmodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.