วิธีการที่คุณพบจะใช้ทดสอบฟังก์ชันการทำงานได้เล็กน้อย แต่ดูเหมือนจะค่อนข้างบอบบาง - คลาสดัมมี่ของคุณ (อันที่จริงเป็นเพียงStruct
วิธีการแก้ปัญหาของคุณ) อาจมีพฤติกรรมเหมือนคลาสจริงที่include
คุณกังวลหรือไม่ก็ได้ นอกจากนี้หากคุณกำลังพยายามทดสอบความกังวลเกี่ยวกับโมเดลคุณจะไม่สามารถทำสิ่งต่างๆเช่นทดสอบความถูกต้องของวัตถุหรือเรียกใช้การเรียกกลับ ActiveRecord เว้นแต่คุณจะตั้งค่าฐานข้อมูลตามนั้น (เนื่องจากคลาสจำลองของคุณจะไม่มีการสำรองตารางฐานข้อมูล มัน). ยิ่งไปกว่านั้นคุณไม่เพียงต้องการทดสอบข้อกังวลเท่านั้น แต่ยังต้องทดสอบพฤติกรรมของข้อกังวลภายในข้อกำหนดรุ่นของคุณด้วย
ทำไมไม่ฆ่านกสองตัวด้วยหินก้อนเดียว? ด้วยการใช้กลุ่มตัวอย่างที่ใช้ร่วมกันของ RSpec คุณสามารถทดสอบข้อกังวลของคุณกับชั้นเรียนจริงที่ใช้พวกเขา (เช่นแบบจำลอง) และคุณจะสามารถทดสอบได้ทุกที่ที่ใช้ และคุณต้องเขียนการทดสอบเพียงครั้งเดียวจากนั้นรวมไว้ในข้อมูลจำเพาะของรุ่นใด ๆ ที่ตรงกับความกังวลของคุณ ในกรณีของคุณสิ่งนี้อาจมีลักษณะดังนี้:
# 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
ข้อดีของวิธีนี้จะชัดเจนยิ่งขึ้นเมื่อคุณเริ่มทำสิ่งที่คุณกังวลเช่นเรียกใช้การเรียกกลับ AR ซึ่งสิ่งที่น้อยกว่าวัตถุ AR จะไม่ทำ