रेल में चिंता का परीक्षण कैसे करें


104

यह देखते हुए कि मुझे Personableअपने रेल 4 एप्लिकेशन में एक चिंता है जो एक full_nameविधि है, मैं RSpec का उपयोग करके इस परीक्षण के बारे में कैसे जाऊंगा?

चिंताओं / personable.rb

module Personable
  extend ActiveSupport::Concern

  def full_name
    "#{first_name} #{last_name}"
  end
end

आप किस परीक्षण ढांचे का उपयोग कर रहे हैं? यह भी याद रखें कि पर्सनलेबल सिर्फ एक सामान्य रूबी मॉड्यूल है। इसे वैसे ही टेस्ट करें जैसे आप किसी अन्य मिक्सिन का परीक्षण करेंगे।
ली जार्विस

ActiveSupport::Concernरेल से बाहर नहीं निकाला गया है? मैंने सोचा कि यह थोड़ी देर पहले चला गया।
रसेल

@LeeJarvis मैं w /
FactoryGirl के


4
@ रसेल मैं सहमत हूँ। उस ने कहा, मैं किसी को उनके सवालों के साथ मदद नहीं करूंगा क्योंकि वे एक ऐसा काम करने के रेल-वाई तरीके का पालन कर रहे थे जिससे मैं सहमत नहीं था। वैसे भी यह इस सवाल के विषय से बचने की तरह है :-)
ली जार्विस

जवाबों:


176

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

इस दृष्टिकोण के फायदे और भी स्पष्ट हो जाते हैं जब आप अपनी चिंता में चीजों को करना शुरू करते हैं जैसे कि एआर कॉलबैक को लागू करना, जहां एआर वस्तु से कम कुछ भी नहीं होगा।


2
इसका एक नुकसान यह है कि यह धीमा हो जाएगा parallel_tests। मुझे लगता है कि यह उपयोग करने के बजाए अलग परीक्षण के लिए बेहतर होगा shared_examples_forऔर it_behaves_like
आर्टेम कलिनचुक

6
@ArtemKalinchuk मुझे यकीन नहीं है कि यह सच है, प्रति github.com/grosser/parallel_tests/issues/168 parallel_tests प्रति फ़ाइल आधारित हैं, इसलिए साझा किए गए उदाहरणों को इसे धीमा नहीं करना चाहिए। मैं यह भी तर्क दूंगा कि ठीक से साझा व्यवहार, ट्रंप परीक्षण गति।
आरोन के

8
concernsनिर्देशिका को अपने spec_helper.rb github.com/rspec/rspec-core/issues/407#issuecomment-1409871
Ziggy

1
मुझे उस लिंक में चिंता निर्देशिका सहित कुछ भी नहीं मिला। क्या आप स्पष्ट कर सकते हैं कि यह कैसे किया जाता है? मैं अपनी चिंताओं में से एक मॉड्यूल को पहचानने के लिए अपना RSpec परीक्षण प्राप्त नहीं कर सकता।
जेक स्मिथ

4
_specउस फ़ाइलनाम में न जोड़ें , जिसमें साझा किया गया है साझा करें_एक्सामपेन्स_फ़ॉर्म (इस मामले में personable_spec.rb), अन्यथा आपको एक भ्रामक चेतावनी संदेश मिलेगा - github.com/rspec/rspec-core/issues/828
लालू

62

मुझे मिली टिप्पणियों के जवाब में, यहां बताया गया है कि मैंने क्या किया है (यदि किसी को सुधार है तो कृपया उन्हें पोस्ट करने के लिए स्वतंत्र महसूस करें) :

कल्पना / चिंताओं / personable_spec.rb

require 'spec_helper'

describe Personable do
  let(:test_class) { Struct.new(:first_name, :last_name) { include Personable } }
  let(:personable) { test_class.new("Stewart", "Home") }

  it "has a full_name" do
    expect(personable.full_name).to eq("#{personable.first_name} #{personable.last_name}")
  end
end

1
हां, यह अन्य परीक्षणों को तोड़ देगा यदि वे एक वास्तविक वर्ग नामक परीक्षण करने के लिए होते हैं Person। मैं ठीक करने के लिए संपादित करूँगा।
रसेल

यह काम नहीं करता है। यह मुझे त्रुटि देता है:undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
काइल डिकोट

इसे विस्तार देने के बजाय व्यक्तिगत सहित प्रयास करें। मैं जवाब अपडेट कर दूंगा।
रसेल

अब महान काम करता है। मुझे सही दिशा में इशारा करने और मुझे रिफ्लेक्टर @ रसेल की मदद करने के लिए धन्यवाद
काइल डिकोट

महान काम करता है और अच्छा लगता है
एडवर्ड

7

इस तरह की चीजों का परीक्षण करने के लिए with_model रत्न का उपयोग करने के लिए एक और विचार है । मैं खुद एक चिंता का परीक्षण करना चाह रहा था और pg_search मणि ​​को ऐसा करते देखा था । यह अलग-अलग मॉडल पर परीक्षण करने से बहुत बेहतर लगता है, क्योंकि वे बदल सकते हैं, और उन चीजों को परिभाषित करना अच्छा है जिन्हें आप अपने चश्मे में चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.