2011-05-02 10 views
7

मैं एक वसंत/हाइबरनेट पृष्ठभूमि से आ रहा हूं। मैंने देखा है कि रेलों में कोई दाओ और सेवा परत नहीं है। यह वास्तव में विकास को गति देता है, लेकिन मुझे नहीं पता कि कभी-कभी मेरे परीक्षण कहां रखना है।मैं अपने डेटाबेस क्वेरी परीक्षण रेल में कहां डालूं?

अभी, मैं मुख्य मॉडल spec में अपने मॉडल विधियों और सत्यापन परीक्षण डाल रहा हूं। यह फ़ाइल पहले से काफी बड़ी है।

प्रश्नों का परीक्षण करने के लिए 'मानक' स्थान कहां है? मैं अपने आप को यह सुनिश्चित करने के लिए बहुत सारे फिक्स्चर/डमी डेटा बनाने की कल्पना कर सकता हूं कि मेरे प्रश्न अपेक्षित काम कर रहे हैं (शायद रेलवे के लिए नया होने के बाद भी एक बेहतर विचार)। बुनियादी मॉडल तर्क और सत्यापन परीक्षणों के लिए इनकी वास्तव में आवश्यकता नहीं है।

यदि आप इन परीक्षणों को कहां रखते हैं, तो रेलवे (विशेष रूप से एकाधिक जुड़ने वाले लोगों के साथ पूछे जाने वाले प्रश्नों का परीक्षण करने का सबसे अच्छा तरीका) के बारे में कुछ सलाह दे सकते हैं, और शायद कुछ बुनियादी दिशानिर्देश हैं कि यह डीबीनिट/वसंत/हाइबरनेट, यह बहुत अच्छा होगा।

धन्यवाद!

+0

सुनिश्चित नहीं है कि "प्रश्न" से आपका क्या मतलब है। रेल में, वस्तुओं को बनाए रखने के लिए एक स्थान के रूप में अपने डेटाबेस के बारे में सोचना बेहतर है। ActiveRecord ऑब्जेक्ट्स अधिक सटीक होने के लिए। ओआरएम सभी डेटाबेस तर्क और एसक्यूएल का ख्याल रखता है। उनको तब तक परीक्षण करने की आवश्यकता नहीं है जब तक कि आप सम्मेलन के खिलाफ कुछ नहीं कर रहे हों। –

+0

@ माइक किसान ActiveRecord एक जटिल और effecient sql 20 तालिकाओं के बीच जुड़ जाएगा यदि आप किसी विशिष्ट मान का अनुरोध करने से पहले 20 बार ऑब्जेक्ट ग्राफ़ चलाते हैं? – egervari

+0

जब तक आप अपने संगठनों को सही तरीके से सेटअप करते हैं, मैं वास्तव में नहीं देखता कि क्यों नहीं। डेटाबेस पृष्ठभूमि से आ रहा है, हालांकि मैं आपका बिंदु देखता हूं। यह सुनिश्चित करने के लिए परीक्षण लिखना कि आपके प्रश्न सही तरीके से बनाए गए हैं और प्रदर्शनकर्ता आपके द्वारा निर्दिष्ट जटिलता के साथ एक अच्छा विचार है। अपने एसोसिएशन के लिए कुछ finder_sql, counter_sql, delete_sql, और insert_sql को संशोधित करना अधिक जटिल प्रश्नों के लिए सहायक भी हो सकता है। देखें (http://j.mp/lOSBkh) –

उत्तर

4

मैं भी हाइबरनेट के साथ काम करता था। ActiveRecord रास्ता हाइबरनेट से बहुत अलग है। बेहतर या बदतर के लिए आपको अपने दिमाग को मुक्त करने की जरूरत है। जावा और हाइबरनेट में आपके पास अक्सर कुल रूट और ऑब्जेक्ट ग्राफ़ होता है। आम तौर पर, ऑब्जेक्ट ग्राफ़ और कोड बेस दोनों रूबी में भी छोटे होते हैं। मुझे आपका विशेष मामला नहीं पता है, इसलिए मैं सावधानी से चलूंगा, लेकिन मैं आपको अपनी जावा आदतों में रूबी और रेलों को फिट करने की कोशिश करने की चेतावनी देता हूं।

आप आरएसपीईसी के साथ कस्टम निर्देशिकाओं का उपयोग ऐसे तरीके से व्यवस्थित करने के लिए कर सकते हैं जो आपके और आपकी टीम के लिए समझ में आता है।

#spec/queries/my_custom_search_spec.rb 

require 'spec_helper' 
describe MyModel do 
    it "should do this query and return X" do 
    subject.some_defined_scope_search.should == "something" 
    end 
end 

और आप उपनिर्देशिकाएं हो सकता है, स्वचालित रूप से rspec द्वारा उठाया जा रहा है, spec/models/account/..

की तरह कल्पना स्वचालित रूप से rake spec या rspec spec द्वारा उठाया हो जाएगा। मैंने ऊपर एक साधारण उदाहरण लिखा है, क्योंकि मुझे आपका मामला नहीं पता है। क्या आप प्रश्नों के साथ स्कोप परिभाषित करते हैं, या विशेष तरीकों को परिभाषित करते हैं?

मैं दृढ़ता से फिक्स्चर को छोड़ने की सलाह देता हूं (जैसे कि आवेषण - विरोधी पैटर्न, मेरे लिए) कुछ और प्रतिक्रियात्मक, कारखानों की तरह। मुझे factory_girl पसंद है। यह आपके ऐप को अधिक चुस्त तरीके से विकसित करता है, आईएमओ।

संपादित करें:

RSpec.configure do |config| 
    require 'database_cleaner' 
    config.add_setting :skip_database_clean 
    config.skip_database_clean = false 
    config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    end 

    config.after(:each) do 
    MongoMapper.database.collections.each(&:remove) 
    DatabaseCleaner.clean unless config.skip_database_clean 
    end 

मैं चर skip_database_clean जोड़ें ताकि मैं सक्षम/प्रत्येक कल्पना के बाद autocleanup निष्क्रिय कर सकते हैं सक्षम/अक्षम स्वत: सफाई के लिए सेटिंग्स के साथ मेरी spec_helper.rb जोड़ने (प्रत्येक "यह") ।

before :all do 
    @an_object = some_expensive_test_buildup 
    RSpec.configuration.skip_database_clean = true 
    end 
    after :all do 
    RSpec.configuration.skip_database_clean = false 
    DatabaseCleaner.clean 
    end 
+0

हाँ, मैं पहले से ही फैक्ट्री लड़की का उपयोग कर रहा हूँ। मुझे लगता है कि यह सुनिश्चित करने के लिए कि वे काम कर रहे हैं, मुझे प्रश्नों का उचित परीक्षण करने के लिए 3-4 रिकॉर्ड, साथ ही उनकी निर्भरताएं भी करने की आवश्यकता है। तो टेस्ट सेटअप कोड बहुत बड़ा हो गया है क्योंकि परीक्षणों को पास करने और क्वेरी तर्क काम करने के लिए सभी क्वेरी संभावनाओं का परीक्षण करने के लिए मुझे थोड़ा मिनी-डेटाबेस बनाना पड़ सकता है। – egervari

+0

एक spec चलाने में कितना समय लगता है? आप पहले से 'पहले' सभी में टेस्ट डेटा बिल्ड-अप कर सकते हैं और फिर डेटा पर क्वेरी चश्मा का एक गुच्छा कर सकते हैं। यदि आपके पास स्वत: क्लीनअप सक्रिय है (जैसे डेटाबेस क्लीयरर) – oma

+0

असल में, मेरे परीक्षणों को एक नए फ़ोल्डर में ले जाने से रेलों को चीजों को साफ नहीं किया जाता है, तो आपको वैश्विक 'पहले: प्रत्येक' को अक्षम करना होगा। क्या मुझे पर्यावरण में कहीं भी इसे चालू करने की ज़रूरत है? – egervari

0

यदि आप सामान्य रेल ORM का उपयोग करते हैं, तो आप क्वेरी नहीं बनाते हैं, और आपको डेटा पहुंच का परीक्षण करने की आवश्यकता नहीं है।

यदि आप कस्टम एसक्यूएल प्रश्न लिखना शुरू करते हैं, तो मैं आपको आरएसपीईसी का उपयोग करने और प्रश्नों को निष्पादित करने के बाद अपनी वस्तुओं के व्यवहार की जांच करने की सलाह देता हूं।

+0

आप रेल ओआरएम का उपयोग कैसे करेंगे और प्रश्न नहीं बनायेंगे ...? और मैं नहीं पूछ रहा हूं कि मुझे उनका परीक्षण करना चाहिए या नहीं - मैं पूछ रहा हूं "इन परीक्षणों को कहां जाना चाहिए?" क्या वे मॉडल स्पेक में करते हैं? एक अलग spec में पूरी तरह से? कहा पे? मुझे पता है कि उनका परीक्षण कैसे करें - मैं कहां से पूछ रहा हूं। – egervari

+0

यदि आप रेल मॉडल की अपेक्षा करते हैं तो आप अपने मॉडल को परिभाषित करते हैं, तो आप प्रश्न नहीं लिखते हैं। आप बस: "@ account.purchases" और वह उस खाते के लिए खरीदारी लौटाता है। आप एक नमूना लिख ​​सकते हैं कि खरीद एक खाते से संबंधित होना चाहिए, लेकिन जहां तक ​​मैं जाऊंगा। –

+0

यह ईमानदारी से बहुत लंबे ऑब्जेक्ट ग्राफ के लिए जेसी करने का एक भयानक तरीका है। यह वास्तव में पूछताछ नहीं कर रहा है - आप वास्तव में डेटाबेस से डेटा बाहर खींच रहे हैं। यह भयानक है। यदि आपको इच्छित डेटा प्राप्त करने के लिए 20 टेबल में शामिल होना पड़ा, तो क्या आप वास्तव में ऑब्जेक्ट ग्राफ को 20 बार चलेंगे? क्या होगा यदि प्रत्येक संग्रह में 100 रिकॉर्ड थे ... जो डेटाबेस से बाहर निकाले गए 100^20 रिकॉर्ड होंगे! नहीं, ऐसा करने का सबसे अच्छा तरीका QUERY है - इसलिए सवाल। – egervari

1

रेल अरेल का उपयोग करता संबंधों के आधार पर अपने डेटाबेस प्रश्नों के लिए एसक्यूएल आप रेल ActiveRecord संघों एपीआई के माध्यम से रूबी कोड में परिभाषित उत्पन्न करने के लिए (यदि आप अपने ORM के रूप में ActiveRecord का उपयोग कर रहे संभालने, यह डिफ़ॉल्ट है)। यदि आप सोचते हैं कि आप स्वचालित रूप से जेनरेट किए गए (जो आप लॉग फ़ाइलों में देख सकते हैं) पर सुधार कर सकते हैं तो आप अपना स्वयं का एसक्यूएल लिख सकते हैं।

आमतौर पर आप मॉडल पर एक विधि कॉल के माध्यम से इन प्रश्नों (मैन्युअल रूप से या स्वचालित रूप से लिखे गए) का आह्वान करेंगे। उदाहरण के लिए, @author.books या @author.readers; ये एक प्रश्न जोड़ सकता है जो जुड़ता है।

मुझे हाथ से लिखित प्रश्नों के बारे में निश्चित नहीं है, लेकिन जेनरेट किए गए प्रश्न आमतौर पर उन क्षेत्रों के साथ बनाए जाते हैं जो परिणाम पूरी होने पर पूरी तरह से बनाए जाते हैं। उदाहरण के लिए, @author.books.order('price').limit(10)। आप अपने स्वयं के कस्टम स्कोप को परिभाषित कर सकते हैं।

मैं मॉडल के काम के अभिन्न अंग के मामले में मॉडल के लिए इकाई परीक्षण में अपने कस्टम प्रश्नों या क्षेत्रों की शुद्धता का परीक्षण करूंगा। उदाहरण के लिए, @author.popular_books आपके मॉडल पर परिभाषित एक कस्टम स्कोप हो सकता है, और आप अपने Author मॉडल के लिए एक यूनिट परीक्षण लिख सकते हैं ताकि यह सुनिश्चित किया जा सके कि यह कुछ ज्ञात परीक्षण डेटा के लिए अपेक्षित परिणाम लौटाता है।

+0

संक्षेप में मुझे लगता है कि आपके पास सही जगह पर आपके परीक्षण हैं। हो सकता है कि आप अपने कोड की लंबाई को कम करने के लिए कुछ परीक्षण सहायक लिख सकें? मददगारों के लिए विचार प्राप्त करने के लिए कंधे परीक्षण ढांचे पर एक नज़र डालें (आपको वास्तव में इसका उपयोग करने की आवश्यकता नहीं है, लेकिन इसमें सामान्य सत्यापन करने के लिए बहुत सारे सहायक हैं जैसे चेक सत्यापन)। –

+0

इस प्रकार मैं वर्तमान में इसे कर रहा हूं।इन स्कॉप्ड प्रश्नों को लिखना एक दर्द बनना शुरू होता है जब मुझे कई जोड़ों की आवश्यकता होती है, और इसलिए मुझे यह सत्यापित करने के लिए डेटाबेस में बहुत सारे टेस्ट डेटा बनाने की आवश्यकता है कि क्वेरी काम कर रही है। यह अक्सर मॉडल spec फ़ाइल bloats – egervari

संबंधित मुद्दे