Setup RSpec untuk menguji permata (bukan Rails)

154

Sangat mudah dengan tambahan generator rspec-rails untuk mengatur RSpec untuk menguji aplikasi Rails. Tetapi bagaimana dengan menambahkan RSpec untuk menguji permata dalam pengembangan? Saya tidak menggunakan perhiasan atau alat semacam itu. Saya baru saja menggunakan Bundler ( bundle gem my_gem) untuk mengatur struktur untuk permata baru dan mengedit * .gemspec secara manual. Saya juga menambahkan s.add_development_dependency "rspec", ">= 2.0.0"ke gemspec dan melakukan bundle install.

Apakah ada tutorial yang bagus apa yang harus dilakukan selanjutnya agar RSpec berfungsi?

Zardoz
sumber
Saya kira saya harus menulis satu :-) ... Setidaknya ada dua permata yang sudah mengintegrasikannya dengan baik: act-as-taggable-on dan act_as_geocodable.
Zardoz

Jawaban:

255

Saya telah memperbarui jawaban ini untuk mencocokkan praktik terbaik saat ini:

Bundler mendukung pengembangan permata dengan sempurna. Jika Anda membuat permata, satu - satunya hal yang perlu Anda miliki di Gemfile adalah sebagai berikut:

source "https://rubygems.org"
gemspec

Ini memberitahu Bundler untuk melihat ke dalam file gemspec Anda untuk dependensi ketika Anda menjalankan bundle install.

Selanjutnya, pastikan RSpec adalah ketergantungan pengembangan permata Anda. Edit gemspec sehingga terbaca:

spec.add_development_dependency "rspec"

Selanjutnya, buat spec/spec_helper.rbdan tambahkan sesuatu seperti:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

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

Dua baris pertama memberi tahu Bundler untuk memuat hanya permata di dalam gemspec Anda. Saat Anda memasang permata Anda sendiri di mesin Anda sendiri, ini akan memaksa spesifikasi Anda untuk menggunakan kode Anda saat ini, bukan versi yang telah Anda instal secara terpisah.

Buat spec, misalnya spec/foobar_spec.rb:

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

Opsional: tambahkan .rspecfile untuk opsi default dan letakkan di jalur root permata Anda:

--color
--format documentation

Akhirnya: jalankan spesifikasi:

$ rspec spec/foobar_spec.rb
iain
sumber
75
Agar adil, Anda harus memohon perintah init RSpec untuk menghasilkan file kerangka spec daripada harus mengetik secara manual. Ini akan memastikan kompatibilitas dengan versi RSpec yang Anda gunakan: rspec --init
Attila Györffy
12
rspec --inittidak tersedia ketika saya menulis ini, tapi bagus!
iain
Sebenarnya saya menemukan cara terbaik untuk melakukan need dalam spec helper adalah ini: memerlukan 'rubygems' memerlukan 'bundler / setup' Bundler.require (: default
,:
Bagaimana tepatnya tiga baris kode @ mkon bekerja secara berbeda dari tiga baris kode iain?
Nakilon
1
Baris dari @mkon akan membutuhkan semua permata di grup pengembangan dan pengujian, sedangkan pendekatan saya adalah meminta setiap permata secara manual. Karena Anda perlu meminta setiap permata sendiri saat membuat permata, saya pikir itu adalah pendekatan yang lebih baik / lebih jelas meskipun mungkin sedikit lebih banyak pekerjaan.
iain
53

Solusi Iain di atas berfungsi dengan baik!

Jika Anda juga menginginkan Rakefile, ini yang Anda butuhkan:

require 'rspec/core/rake_task'

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

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

Periksa RDoc untuk RakeTask untuk berbagai opsi yang secara opsional dapat Anda berikan ke definisi tugas.

Mirko Froehlich
sumber
26

Anda dapat menghasilkan permata baru Anda dengan rspec dengan menjalankan bundler gem --test=rspec my_gem. Tanpa Pengaturan tambahan!

Saya selalu melupakan ini. Diimplementasikan di sini: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36

StevenNunez
sumber
1
Rapi! Namun, saya pikir nama permata Anda harus ditentukan dengan garis bawah, bukan kasing. Jika tidak, Bundler membuat file dengan huruf besar (Bundler 1.7.4)
Malte
Bundler mengeluh --test=rspec, tetapi masih bertanya apakah saya ingin menggunakan Rspec ketika saya berlari bundler gem my_gem.
Nicolas Mattia
7

Inilah cara yang murah dan mudah (meskipun tidak disarankan secara resmi):

Buat dir di root permata Anda disebut spec, masukkan spesifikasi Anda di sana. Anda mungkin sudah menginstal rspec, tetapi jika tidak, lakukan saja gem install rspecdan lupakan Gemfiles dan bundler.

Selanjutnya, Anda akan membuat spec, dan Anda harus memberi tahu di mana aplikasi Anda berada, di mana file Anda berada, dan termasuk file yang ingin Anda uji (beserta semua dependensinya):

# 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

Buka Terminal dan jalankan rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Jika Anda ingin beberapa .rspecopsi suka, buat .rspecfile dan letakkan di jalur root permata Anda. Milik saya terlihat seperti ini:

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

Mudah, cepat, rapi!

Saya suka ini karena Anda tidak perlu menambahkan dependensi ke proyek Anda sama sekali, dan semuanya tetap sangat cepat. bundle execsedikit melambat, yang harus Anda lakukan untuk memastikan Anda menggunakan versi rspec yang sama setiap saat. 0,56 detik yang diperlukan untuk menjalankan dua tes 99% diambil pada saat komputer saya memuat rspec. Menjalankan ratusan spesifikasi harus sangat cepat. Satu-satunya masalah yang Anda bisa temui yang saya tahu adalah jika Anda mengubah versi rspec dan versi baru tidak kompatibel dengan beberapa fungsi yang Anda gunakan dalam pengujian Anda, Anda mungkin harus menulis ulang beberapa tes.

Ini bagus jika Anda melakukan spesifikasi satu kali atau memiliki alasan yang bagus untuk TIDAK memasukkan rspec di gemspec Anda, namun itu tidak terlalu baik untuk mengaktifkan berbagi atau menegakkan kompatibilitas.

wulftone
sumber
Apakah ada cara untuk tidak menempatkan AwesomeGem :: sebelum nama kelas setiap kali Anda merujuk ke objek pengujian? Atau ketika Anda membuat tes baru seperti pada contoh Anda.
Misha Slyusarev
1
Tentu, Anda dapat menetapkan nama kelas Anda sama dengan sesuatu yang lebih pendek, seperti Thing = AwesomeGem::Awesomeatau Anda dapat melakukan tes di dalam modul, sepertimodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone