Apa praktik terbaik pada modul pengujian di rspec? Saya memiliki beberapa modul yang disertakan dalam beberapa model dan untuk saat ini saya hanya memiliki tes duplikat untuk setiap model (dengan beberapa perbedaan). Apakah ada cara untuk KERING itu?
ruby
unit-testing
rspec
Andrius
sumber
sumber
let(:dummy_class) { Class.new { include ModuleToBeTested } }
let(:class_instance) { (Class.new { include Super::Duper::Module }).new }
:, dengan cara itu saya mendapatkan variabel instan yang paling sering digunakan untuk pengujian dengan cara apa pun.include
tidak bekerja untuk saya tetapiextend
tidaklet(:dummy_class) { Class.new { extend ModuleToBeTested } }
subject(:instance) { Class.new.include(described_class).new }
Apa kata Mike. Berikut ini contoh sepele:
kode modul ...
fragmen spesifikasi ...
sumber
include Say
berada di dalam deklarasi DummyClass alih-alih meneleponextend
?extend
masuk ke instance kelas, yaitu setelahnew
dipanggil. Jika Anda melakukan ini sebelumnyanew
dipanggil maka Anda benar Anda akan menggunakaninclude
DummyClass
konstanta? Kenapa tidak adil@dummy_class = Class.new
? Sekarang Anda mencemari lingkungan pengujian Anda dengan definisi kelas yang tidak perlu. DummyClass ini didefinisikan untuk setiap spesifikasi Anda dan dalam spesifikasi berikutnya di mana Anda memutuskan untuk menggunakan pendekatan yang sama dan membuka kembali definisi DummyClass mungkin sudah mengandung sesuatu (meskipun dalam contoh sepele ini definisi itu benar-benar kosong, dalam kehidupan nyata kasus penggunaan kemungkinan ada sesuatu yang ditambahkan di beberapa titik dan kemudian pendekatan ini menjadi berbahaya.)Untuk modul yang dapat diuji secara terpisah atau dengan mengejek kelas, saya menyukai sesuatu seperti:
modul:
spec:
Mungkin keliru untuk membajak kelompok contoh bersarang, tapi saya suka kesempitan itu. Adakah pikiran?
sumber
let
metode yang dijelaskan oleh @metakungfu lebih baik.Saya menemukan solusi yang lebih baik di beranda rspec. Tampaknya itu mendukung contoh grup yang dibagikan. Dari https://www.relishapp.com/rspec/rspec-core/v/2-13/docs/example-groups/shared-examples !
sumber
Dari atas kepala saya, bisakah Anda membuat kelas dummy dalam skrip pengujian Anda dan memasukkan modul ke dalamnya? Kemudian uji bahwa kelas dummy memiliki perilaku seperti yang Anda harapkan.
EDIT: Jika, seperti yang ditunjukkan dalam komentar, modul mengharapkan beberapa perilaku untuk hadir di kelas yang dicampur, maka saya akan mencoba untuk menerapkan boneka perilaku tersebut. Cukup membuat modul senang melakukan tugasnya.
Yang mengatakan, saya akan sedikit gugup tentang desain saya ketika sebuah modul mengharapkan banyak dari kelas hostnya (apakah kita mengatakan "host"?) - Jika saya belum mewarisi dari kelas dasar atau tidak dapat menyuntikkan fungsi baru ke dalam pohon warisan maka saya pikir saya akan mencoba untuk meminimalkan harapan yang mungkin dimiliki modul. Kekhawatiran saya adalah bahwa desain saya akan mulai mengembangkan beberapa bidang yang tidak fleksibel.
sumber
Jawaban yang diterima adalah jawaban yang tepat menurut saya, namun saya ingin menambahkan contoh bagaimana menggunakan rpsec
shared_examples_for
danit_behaves_like
metode. Saya menyebutkan beberapa trik dalam cuplikan kode tetapi untuk info lebih lanjut lihat panduan relishapp-rspec ini .Dengan ini, Anda dapat menguji modul Anda di salah satu kelas yang menyertakannya. Jadi Anda benar-benar menguji apa yang Anda gunakan dalam aplikasi Anda.
Mari kita lihat sebuah contoh:
Sekarang mari kita buat spec untuk modul kami:
movable_spec.rb
sumber
Bagaimana dengan:
sumber
Saya akan menyarankan bahwa untuk modul yang lebih besar dan banyak digunakan orang harus memilih "Grup Contoh Bersama" seperti yang disarankan oleh @ Andrius di sini . Untuk hal-hal sederhana yang Anda tidak ingin mengalami masalah memiliki banyak file dll. Di sini adalah cara untuk memastikan kontrol maksimum atas visibilitas barang dummy Anda (diuji dengan rspec 2.14.6, cukup salin dan tempel kode ke dalam file spesifikasi dan jalankan):
sumber
subject { dummy_class.new }
berfungsi. Kasingsubject { dummy_class }
tidak bekerja untuk saya.pekerjaan saya baru-baru ini, menggunakan kabel sekecil mungkin
saya harap
bekerja, tetapi tidak (seperti pada Ruby MRI 2.2.3 dan RSpec :: Core 3.3.0)
Jelas diuraikan_class tidak terlihat dalam lingkup itu.
sumber
Untuk menguji modul Anda, gunakan:
Untuk KERING beberapa hal yang Anda gunakan di beberapa spesifikasi, Anda dapat menggunakan konteks bersama:
Sumber:
sumber
Anda juga dapat menggunakan jenis pembantu
Berikut dokumentasinya: https://www.relishapp.com/rspec/rspec-rails/v/3-3/docs/helper-specs/helper-spec
sumber
Anda hanya perlu memasukkan modul Anda ke file
mudule Test module MyModule def test 'test' end end end
spec Anda di file spec AndaRSpec.describe Test::MyModule do include Test::MyModule #you can call directly the method *test* it 'returns test' do expect(test).to eql('test') end end
sumber
Salah satu solusi yang mungkin untuk menguji metode modul yang independen pada kelas yang akan memasukkannya
Dan spec untuk itu
Dan jika Anda ingin KERING mengujinya, maka shared_examples adalah pendekatan yang baik
sumber
subject(:module_to_test_instance) { Class.new.include(described_class) }
. Kalau tidak, saya tidak benar-benar melihat ada yang salah dengan jawaban Anda.Ini adalah pola berulang karena Anda perlu menguji lebih dari satu modul. Karena itu, ini lebih dari sekadar diinginkan untuk membuat pembantu untuk ini.
Saya menemukan posting ini yang menjelaskan bagaimana melakukannya tetapi saya berupaya di sini karena situs tersebut mungkin akan dihapus pada beberapa titik.
Ini untuk menghindari instance objek, jangan mengimplementasikan metode instance:: kesalahan apa pun yang Anda dapatkan saat mencoba
allow
metodedummy
kelas.Kode:
Di
spec/support/helpers/dummy_class_helpers.rb
Di
spec/spec_helper.rb
Dalam spesifikasi Anda:
sumber