2012-04-21 13 views
5

का उपयोग करते समय मैं यूनिट परीक्षणों में निरंतर घटक पथ कैसे रखूं? मेरे पास कई विकेट परीक्षण हैं जो एक क्रमबद्ध डेटाटेबल को लक्षित करते हैं, विशेष रूप से क्रमबद्ध कॉलम हेडर पर अजाक्स-क्लिक करके और रेंडर बॉडी पंक्तियों की सामग्री पर जोर देते हुए। अब तालिका घटक के वंशजों के घटक पदानुक्रम छँटाई लिंक (AJAX) के लिए इसी तरह के रास्तों में विकेट ढांचे द्वारा स्वत: जनरेट किया है, और परिणाम है:विकेट परीक्षक

table:topToolbars:toolbars:0:headers:1:header:orderByLink 

हालांकि, जब DataTable परीक्षण भर में फिर से गाया जाता है,

table:topToolbars:toolbars:1:headers:1:header:orderByLink 

जो तब सफल परीक्षण की हार्ड-कोडेड पथ टूट जाता है के रूप में वे अब मिलान हो जाएगा: टूलबार घटक के सूचकांक हर बार यानी के समान वृद्धि की जाती है।

 final PayeesProvider dataProvider = new PayeesProvider(); 
    table = new DataTable<ResponsePayeeDetails>("payees", columns, dataProvider, rowsPerPage); 
    table.setOutputMarkupId(true); 
    table.addTopToolbar(new AjaxFallbackHeadersToolbar(table, dataProvider) { 

     private static final long serialVersionUID = -3509487788284410429L; 

     @Override 
     protected WebMarkupContainer newSortableHeader(final String borderId, final String property, final ISortStateLocator locator) { 
      return new AjaxFallbackOrderByBorder(borderId, property, locator, getAjaxCallDecorator()) { 

       @Override 
       protected void onRender() { 
        System.out.printf("Path: %s\n", this.getPageRelativePath()); 
        super.onRender(); 
       } 

       private static final long serialVersionUID = -6399737639959498915L; 

       @Override 
       protected void onAjaxClick(final AjaxRequestTarget target) { 
        target.add(getTable(), navigator, navigatorInfoContainer); 
       } 

       @Override 
       protected void onSortChanged() { 
        super.onSortChanged(); 
        getTable().setCurrentPage(0); 
       } 
      }; 
     } 
    }); 
    table.addBottomToolbar(new NoRecordsToolbar(table)); 
    add(table); 

सटीक होना, जब मैं अपने परीक्षण, ऊपर System.out.printf बयान प्रिंट चलाने:

(1 परीक्षण)

datatable निर्माण के लिए कोड टुकड़ा इस प्रकार है

Path: payees:topToolbars:toolbars:0:headers:1:header 
Path: payees:topToolbars:toolbars:0:headers:2:header 

(2 परीक्षण)

Path: payees:topToolbars:toolbars:2:headers:1:header 
Path: payees:topToolbars:toolbars:2:headers:2:header 

(3 परीक्षण)

Path: payees:topToolbars:toolbars:4:headers:1:header 
Path: payees:topToolbars:toolbars:4:headers:2:header 

(4 परीक्षण)

Path: payees:topToolbars:toolbars:6:headers:1:header 
Path: payees:topToolbars:toolbars:6:headers:2:header 
Path: payees:topToolbars:toolbars:6:headers:1:header 
Path: payees:topToolbars:toolbars:6:headers:2:header 
Path: payees:topToolbars:toolbars:6:headers:1:header 
Path: payees:topToolbars:toolbars:6:headers:2:header 

(5 वीं परीक्षा)

Path: payees:topToolbars:toolbars:8:headers:1:header 
Path: payees:topToolbars:toolbars:8:headers:2:header 

किसी को कैसे मैं और अधिक नियतात्मक होने के लिए सूचकांक पीढ़ी मजबूर कर सकते हैं पता है/दोहराने योग्य वैकल्पिक रूप से, क्या जंगली-कार्डिंग का कोई तरीका है या अन्यथा पथ को सामान्य बनाना, ताकि इन वृद्धिओं को प्रतिरक्षा कर सकें?

किसी भी मदद की बहुत सराहना की जाएगी!

उत्तर

0

डिफ़ॉल्ट DataTableItemReuseStrategy की वजह से आईडी को हर बार बढ़ाया जा रहा है, जो हर बार ब्रांड नई वस्तुओं को उत्पन्न करता है टेबल ताज़ा किया जाता है। यदि आईडी को रखना एक शीर्ष प्राथमिकता है तो आपके पास कस्टम ItemReuseStrategy को लागू करने में कुछ भाग्य हो सकता है।

हम एक समान मुद्दे में भाग गए और आपके वैकल्पिक प्रश्न के साथ गठबंधन रणनीति पर बस गए हैं। इसके साथ, आप परीक्षा का निरीक्षण करने के लिए पूछ सकते हैं उदा। अंतिम प्रस्तुत पृष्ठ पर तीसरी पंक्ति। नोट: कोड स्कैला में है।

संक्षेप में, इस समस्या को हल करने के लिए हमने WicketTester को बढ़ाने के लिए findNthComponentOnPage विधि लागू की।

/** 
    * @param id Wicket id of component to find 
    * @param n 1-based 
    * @tparam T class of component to find 
    * @return the Nth component of class T appearing on the lastRenderedPage 
    */ 
def findNthComponentOnPage[T <: Component : ClassTag](id: String, n: Int): T = { 
    tester.getLastRenderedPage.visitChildren(classTag[T].runtimeClass, new IVisitor[T, T] { 
    var count = 0 

    override def component(checkbox: T, visit: IVisit[T]): Unit = { 
     if (checkbox.getId == id) { 
     count += 1 
     if (count == n) { 
      visit.stop(checkbox) 
     } 

     } 
    } 
    }) 
} 
+0

बहुत स्पष्ट स्पष्टीकरण पेट्रीसिया के लिए धन्यवाद। –

0

पथ निर्धारित करना काफी कठिन हो सकता है लेकिन आवश्यक नहीं होना चाहिए, क्योंकि इसमें एकीकरण-परीक्षण होगा और यूनिट-टेस्ट नहीं होगा। कॉलम के सॉर्टिंग का परीक्षण आसपास के टेबल पर निर्भर नहीं होना चाहिए, ताकि आप अपने टेस्टकेस में एक डमी-टेबल बना सकें, जिसमें हेडर और एक कॉलम (जिसे सॉर्ट किया जा सकता है) परीक्षण के लिए जोड़ना। यदि आपके पास टूलबार-ऑब्जेक्ट है, तो आप या तो इसका उपयोग कर सकते हैं या getComponent(toolbar.getPageRelativePath()) जारी करके इसे पुनः प्राप्त कर सकते हैं। लेकिन यह सुनिश्चित करना कि AjaxFallbackOrderByBorder वास्तव में काम करता है, इस वर्ग के उपयोगकर्ता के रूप में आपकी चिंता नहीं होनी चाहिए। यह वर्ग के निर्माता द्वारा किया जाना चाहिए था। आपको केवल अपने कोड (जैसे आपके डेटा प्रदाता में सॉर्टिंग-कोड) का परीक्षण करना होगा ...

+0

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

+0

@ माइकल -7 मेरा मुद्दा यह था कि यह परीक्षण कम से कम यूनिटटेस्ट के रूप में नस्लीय नहीं होना चाहिए। मैं यूनिटटेस्ट को एकीकरण परीक्षणों से अलग करता हूं, जेयूनीट द्वारा फॉर्मर्स चलाता हूं, मॉडलों के उत्तर सामान की जांच करता हूं और बाद में "ऊपरी ऊपर" सेलेनियम का उपयोग करके कुछ भी इसी तरह से चलाता हूं, प्रस्तुत पृष्ठों की जांच करता हूं ... – Nicktar

+0

आपकी प्रतिक्रिया निकटर के लिए धन्यवाद। विकेटटेस्टर का उपयोग करने का कारण सेलेनियम का उपयोग करने से बचने के लिए है जो ठीक है लेकिन बोझिल है - यानी एक सर्वर e.t.c. शुरू करना है। विकेटटेस्टर बिल्कुल वही है जो मुझे अपने सर्वर-साइड घटकों का परीक्षण करने की ज़रूरत है, विशेष रूप से सर्वर-साइड एंड-टू-एंड राउंडट्रिप जैसा कि मैं अपने शेष कोड के साथ करता हूं। मुझे ज़ोर देना चाहिए कि यह यूनिट टेस्ट नहीं है, बल्कि सर्विस लेयर के साथ एकीकरण परीक्षण है। –

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