2011-08-12 15 views
6

में बहुत अलग ढंग से व्यवहार कर हम एक कस्टम डेटा स्रोत कि BasicDataSource फैली है। हमने getConnection विधि को ओवरराइड कर दिया है जो इसके अंदर कुछ चीजें करता है। जब हम परीक्षण के बाहर वेबपैप चलाते हैं, जब हम नियंत्रक से सेवा कहते हैं तो यह एक नया कनेक्शन लेगा और सेवा पूरा होने तक उस कनेक्शन का उपयोग करेगा। सब ठीक हैं। हालांकि, एकीकरण परीक्षण के अंदर, परीक्षण से पहले कनेक्शन को पकड़ लिया जाता है, यहां तक ​​कि नियंत्रक को भी कॉल करता है।Grails कनेक्शन एकता परीक्षण

नियमित चलाने के नीचे प्रवाह: कॉल नियंत्रक -> नियंत्रक कॉल सेवा विधि -> कनेक्शन पकड़ा जाता है -> सेवा विधि चलाया जाता है और

एकता टेस्ट नियंत्रक को प्रस्तुत करती है: कनेक्शन पकड़ा जाता है -> कॉल परीक्षण से नियंत्रक -> सेवा विधि से चलाया जाता है और नियंत्रक को

जरूरत नहीं कहने के लिए, यह हमें सही कनेक्शन होने के रूप में समस्याओं दे रहा है देता है हमारे ऐप्लिकेशन के लिए बहुत महत्वपूर्ण है -> नियंत्रक सेवा प्रणाली को बुलाती है। विचार?

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

DataSource.groovy

dataSource { 
pooled = true 
dialect="org.hibernate.dialect.OracleDialect" 
properties { 
    maxActive = 50 
    maxIdle = 10 
    initialSize = 10 
    minEvictableIdleTimeMillis = 1800000 
    timeBetweenEvictionRunsMillis = 1800000 
    maxWait = 10000 
    testWhileIdle = true 
    numTestsPerEvictionRun = 3 
    testOnBorrow = true 
} 

} 
hibernate { 
cache.use_second_level_cache = true 
cache.use_query_cache = true 
cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 
} 
+0

यू ControllerUnitTestCase को लागू कर रहे हैं? या सिर्फ यूनिटटेस्टकेस ?! –

+0

नियंत्रकUnitTestCase – Joseph

+0

क्या आप अपनी DataSource.groovy फ़ाइल पोस्ट कर सकते हैं? –

उत्तर

2

यह अंतिम नहीं है पहुँच गए हैं उत्तर, हालांकि मेरा मानना ​​है कि यह क्या चल रहा है की एक विवरण है:

  • वेब एप्लिकेशन के रूप में चल रहा है: आपकी सेवा वर्ग एक transactionManager जो एक sessionFactory, जो कनेक्शन हो जाता है है! तो इस मामले में, यह सोचते हैं कि आप सेवा 'लेन-देन संबंधी = सच' सभी तरीकों कि आप अपनी सेवाओं में कॉल विधि की शुरुआत में एक 'Session.beginTransaction()' होगा (वहाँ ऐसा करने के लिए एक Grails`s प्रॉक्सी है , जब आप 'लेनदेन = सत्य' सेट करते हैं), जो getConnection() तक सभी स्टैक को कॉल करेगा।

  • इंटीग्रेशन टेस्ट के रूप में चल रहा है: क्योंकि Grails आपके डीबी परिवर्तन नहीं करता है, यह हमेशा उन्हें रोलबैक करता है! मेरा मानना ​​है कि जब आप अपने एकीकरण परीक्षण शुरू कर रहे हैं, तो grails तुरंत एक लेनदेन बना रहा है! तो यह है कि यह बाद में रोलबैक करने में सक्षम हो जाएगा! (जो पूरी तरह से बनाने के सही भावना!), आप इस बात की पुष्टि कर सकते हैं कि वर्ग org.codehaus.groovy.grails.test.support.GrailsTestInterceptor पर एक नज़र ले जा। विधि init() को आपके एकीकरण परीक्षण में आपकी सेवाओं से पहले बुलाया जाता है। तो यही कारण है कि कनेक्शन कनेक्शन() सबकुछ से पहले कहा जा रहा है!

सुझाव: आप लेन-देन = झूठी 'और अगर getConnection() शुरुआत में फोन नहीं मिलता है देखते हैं कि आपका एकीकरण परीक्षण वर्ग सेट करने का प्रयास कर सकते हैं! अधिक देखने के लिए here में लेनदेन अनुभाग पर जाएं! बस यह न भूलें कि आपके परीक्षण में आपको अपने लेनदेन को रोलबैक करना होगा! यदि आपका सेट लेनदेन = झूठा है।

+1

मैं निश्चित रूप से उस समय बाद में कोशिश करूंगा जब मुझे समय मिल जाए। – Joseph

+0

क्षमा करें, मैं बग के साथ व्यस्त रहा हूँ। उम्मीद है कि मेरे पास आज समय होगा :) – Joseph

+0

यह क्या हो रहा है के साथ यह मुद्दा लगता है। चूंकि इसमें पहले से ही एक कनेक्शन है, यह एक नया पकड़ने की कोशिश नहीं करता है। मदद के लिए धन्यवाद एक गुच्छा। – Joseph