Mengingat bahwa saya memiliki Personable
masalah dengan aplikasi Rails 4 saya yang memiliki full_name
metode, bagaimana saya akan menguji ini menggunakan RSpec?
kekhawatiran / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Kyle Decot
sumber
sumber
ActiveSupport::Concern
dibawa keluar dari Rails? Saya pikir itu pergi beberapa waktu yang lalu.Jawaban:
Metode yang Anda temukan pasti akan berfungsi untuk menguji sedikit fungsionalitas tetapi tampaknya cukup rapuh — kelas dummy Anda (sebenarnya hanya
Struct
dalam solusi Anda) mungkin atau mungkin tidak berperilaku seperti kelas nyata yanginclude
menjadi perhatian Anda. Selain itu jika Anda mencoba untuk menguji masalah model, Anda tidak akan dapat melakukan hal-hal seperti menguji validitas objek atau memanggil callback ActiveRecord kecuali Anda mengatur database yang sesuai (karena kelas dummy Anda tidak akan memiliki dukungan tabel database Itu). Selain itu, Anda tidak hanya ingin menguji kekhawatiran tetapi juga menguji perilaku kekhawatiran di dalam spesifikasi model Anda.Jadi mengapa tidak membunuh dua burung dengan satu batu? Dengan menggunakan grup contoh bersama RSpec , Anda dapat menguji kekhawatiran Anda terhadap kelas sebenarnya yang menggunakannya (misalnya, model) dan Anda akan dapat mengujinya di mana pun mereka digunakan. Dan Anda hanya perlu menulis pengujian sekali dan kemudian memasukkannya ke dalam spesifikasi model yang menggunakan perhatian Anda. Dalam kasus Anda, ini mungkin terlihat seperti ini:
Keuntungan dari pendekatan ini menjadi lebih jelas ketika Anda mulai melakukan hal-hal yang menjadi perhatian Anda seperti memanggil callback AR, di mana apa pun yang kurang dari objek AR tidak akan berhasil.
sumber
parallel_tests
. Saya pikir akan lebih baik untuk memiliki tes terpisah daripada menggunakanshared_examples_for
danit_behaves_like
.parallel_tests
didasarkan pada per file, jadi contoh yang dibagikan seharusnya tidak memperlambatnya. Saya juga berpendapat bahwa perilaku bersama yang dikelompokkan dengan benar, mengalahkan kecepatan pengujian.concerns
direktori dispec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
nama file yang berisi shared_examples_for (personable_spec.rb dalam kasus ini), jika tidak, Anda akan mendapatkan pesan peringatan yang menyesatkan - github.com/rspec/rspec-core/issues/828 .Menanggapi komentar yang saya terima, inilah yang akhirnya saya lakukan (jika ada yang memiliki peningkatan, silakan mempostingnya) :
spec / concern / personable_spec.rb
sumber
Person
. Saya akan mengedit untuk memperbaikinya.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Pemikiran lain adalah menggunakan permata with_model untuk menguji hal-hal seperti ini. Saya sendiri sedang mencoba menguji kekhawatiran dan telah melihat permata pg_search melakukan ini . Tampaknya jauh lebih baik daripada menguji pada model individual, karena itu mungkin berubah, dan bagus untuk menentukan hal-hal yang Anda perlukan dalam spesifikasi Anda.
sumber