2011-03-06 7 views
5

मैं परीक्षण करना चाहता हूं कि नियंत्रक सही तर्क के साथ सेवा विधि को कॉल करता है। उसे करने का सबसे अच्छा तरीका कौन सा है?Grails mockFor और कैसे परीक्षण करने के लिए सबसे अच्छा तरीका सही तर्क के साथ बुलाया जाता है

मेरी वर्तमान योजना mockFor का उपयोग करना है और उसके बाद बंद होने के माध्यम से मूल्य को पारित किया गया है। क्या मैकफोर या मॉक ऑब्जेक्ट के माध्यम से परीक्षण करने का एक बेहतर तरीका है जो मैं इसी विधि को करने के लिए मॉकिटो के साथ कर सकता हूं कॉल तर्क मूल्य परीक्षण?

class HappyControllerTests extends ControllerUnitTestCase { 
     : 
    void testSomeValue() { 
     def mockControl = mockFor(HappyService) 
     def givenSomeItem = null 
     mockControl.demand.serviceMethod(1..99) { String someItem -> givenSomeItem = someItem; } 
     controller.happyService = mockControl.createMock() 

     controller.someAction() 

     mockControl.verify() 
     assertEquals("specific value", givenSomeItem) 
    } 
} 

धन्यवाद!

+0

मैं "टेड Naleid" से जवाब की तरह। फिर भी, आईएमएचओ बड़ी दुकानों को मॉकफोर (..) का उपयोग करना चाहिए http://grails.org/doc/latest/guide/9.%20Testing.html#9.2 एकीकरण परीक्षण "... इन तरीकों का उपयोग करके सुनिश्चित करता है कि आपके द्वारा किए गए कोई भी परिवर्तन दिए गए वर्गों के लिए अन्य परीक्षणों में रिसाव नहीं है .. " – finneycanhelp

उत्तर

13

मैं शायद ही कभी mockFor का उपयोग के रूप में मैं ग्रूवी काम करने के लिए आसान के साथ और अधिक शक्तिशाली हो metaClass सामान और as ClassName में बनाया गया है लगता है, मैं यह कर चाहते हैं:

void testSomeValue() { 
    def givenSomeItem = null 
    controller.happyService = [ 
     serviceMethod: { String someItem -> givenSomeItem = someItem } 
    ] as HappyService 

    controller.someAction() 
    assertEquals "specific value", givenSomeItem 
} 
+1

कोड उदाहरण के लिए धन्यवाद। कुछ चीजें होने तक भी मेरा दृष्टिकोण था: 1) मैं जेफ ब्राउन द्वारा एक महान प्रस्तुति के लिए गया और उसके साथ बात की। 2) परीक्षणों के सेटअप() में, मैंने देखा कि मेटा क्लास कभी-कभी कक्षा के सभी उदाहरणों के लिए छेड़छाड़ करता है और ठीक से बहाल नहीं होता है। यह परीक्षणों में साइड इफेक्ट व्यवहार का कारण बन गया और मैं वह था जो क्या हो रहा था। तो .. हालांकि यह संभव है कि ऑब्जेक्ट मैक्स के लिए ग्रोवी मेटा क्लास का उपयोग करें, जो कि इंजेक्ट कर सकता है और दूसरों के लिए नकल कर सकता है, मैं सिर्फ एक बड़ी जावा दुकान में जब mockFor का उपयोग करने की सलाह देता हूं। – finneycanhelp

+1

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

+0

यह वास्तव में कमाल है – tbruyelle

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