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:
# app/models/concerns/personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
# spec/concerns/personable_spec.rb
require 'spec_helper'
shared_examples_for "personable" do
let(:model) { described_class } # the class that includes the concern
it "has a full name" do
person = FactoryBot.build(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
expect(person.full_name).to eq("Stewart Home")
end
end
# spec/models/master_spec.rb
require 'spec_helper'
require Rails.root.join "spec/concerns/personable_spec.rb"
describe Master do
it_behaves_like "personable"
end
# spec/models/apprentice_spec.rb
require 'spec_helper'
describe Apprentice do
it_behaves_like "personable"
end
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.