आपके द्वारा पाई गई विधि निश्चित रूप से थोड़ी कार्यक्षमता का परीक्षण करने के लिए काम करेगी, लेकिन बहुत नाजुक लगती है - आपकी डमी क्लास (वास्तव 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
इस दृष्टिकोण के फायदे और भी स्पष्ट हो जाते हैं जब आप अपनी चिंता में चीजों को करना शुरू करते हैं जैसे कि एआर कॉलबैक को लागू करना, जहां एआर वस्तु से कम कुछ भी नहीं होगा।