2016-04-11 9 views
5

एक स्पॉक विशिष्टता में में किसी भी लाइन की उम्मीद: या तो: ब्लॉक का मूल्यांकन किया और boolean के रूप में जोर दिया जाता है, जब तक यह वापसी प्रकार void साथ हस्ताक्षर हैं।क्या जीबी को शून्य तरीकों से शून्य से वापस करने से रोकने का कोई तरीका है?

मैंने देखा है अजीब कुछ तरीकों किसी भी वर्ग (उदाहरण के Page या Module वर्गों के लिए) Navigator से इनहेरिट पर void के रूप में घोषित करने के लिए हो रहा है कि वहाँ।

Let कहते हैं कि हम इस तरह के उदाहरण हैं:

इस प्रकार
class NavigationSpec extends GebSpec { 

    def 'Collections page has a right header'() { 

     when: 
      to CollectionsPage 

     then: 
      hasHeaderText('Collections') 
    } 
} 

hasHeaderText() विधि CollectionsPage वर्ग के भीतर परिभाषित किया गया है:

class CollectionsPage extends Page { 

    static url = 'movies/collections' 

    void hasHeaderText(String expectedText) { 
     assert true 
    } 
} 

उद्देश्य पर मैं सिर्फ वहाँ पर true जोर देते हुए कर रहा हूँ तो यह कभी नहीं करना चाहिए असफल। भले ही यह एक त्रुटि के साथ विफल:

Condition not satisfied: 

hasHeaderText('Collections') 
| 
null 

कैसे और क्यों एक void विधि कॉल परिणाम null के रूप में मूल्यांकन किया जाता है?

मुझे पता है कि इसे कैसे ठीक करें। विधि वापसी प्रकार boolean के रूप में घोषित करने के लिए पर्याप्त है और true लौटाएं।

boolean hasHeaderText(String expectedText) { 
    assert header.text() == expectedText 
    return true 
} 

यह हालांकि केवल शोर का कारण बनता है: यह हालांकि सभी नहीं तो दावा है निम्नलिखित के रूप में अनावश्यक return true की तरह जोड़ा जाना आवश्यक है बदसूरत है। क्या void विधियों से null लौटने से Geb को रोकने का कोई तरीका है?

मैं हूँ, जाहिर है, ध्यान रखें कि इस विशेष मामले की तरह जा सकते हैं:

boolean hasHeaderText(String expectedText) { 
    header.text() == expectedText` 
} 

यह खो void वापसी प्रकार की विषमता की व्याख्या नहीं करता, न हम ढीला के साथ सार्थक ज़ोर विफलता संदेश का उल्लेख ऐसा दृष्टिकोण

उत्तर

4

यह ग्रोवी भाषा का हिस्सा है कि प्रत्येक विधि एक मूल्य देता है। यह अभिव्यक्तियों में या भेड़ के बच्चे के रूप में किसी भी विधि का उपयोग करने की अनुमति देता है।

सभी विधियों को घोषित किया गया है voidnull लौटाएं।

यदि आपके पास स्पष्ट रूप से कोई वापसी विवरण नहीं है, तो आपकी विधि में अंतिम अभिव्यक्ति का परिणाम वापस कर दिया गया है।

आप बाईटकोड देख सकते हैं ... यहां तक ​​कि अगर आप एक वापसी प्रकार की घोषणा, आप वास्तव में ग्रूवी के रूप में कुछ भी वापस करने की जरूरत नहीं होगी, डिफ़ॉल्ट रूप से, वापसी अशक्त:

// returns null 
String callMe() { } 

static void main(args) { 
    def x = callMe() 
    assert x == null 
    println "OK!" 
} 

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

boolean hasHeaderText(String expectedText) { 
    header.text() == expectedText 
} 

और then ब्लॉक में इसका इस्तेमाल करते हैं:

then: 'The header has the expected text #expectedText' 
hasHeaderText expectedText 

लगता है बहुत अगर अच्छा

तो, अभिकथन आप चाहते हैं लिखने के लिए सही तरीका है अपने विधि एक बूलियन वापसी बनाने के लिए है आपने मुझसे पूछा।

संपादित

मैंने देखा है कि ग्रूवी/स्पॉक वास्तव में भी then ब्लॉक में एक सामान्य शून्य विधि का परिणाम पर जोर नहीं होगा ... क्या शायद यहाँ हो रहा है यह है कि आप सामान्य शून्य विधि नहीं है, तो आप CollectionsPage की गतिशील विधि को कॉल कर रहे हैं (मुझे लगता है कि यह प्ले में गेब का जादू है), जिसका अर्थ है कि, शायद, स्पॉक एएसटी ट्रांसफार्मर को हस्ताक्षर की जांच करने का अवसर नहीं है जिस विधि को आप बुला रहे हैं, इसलिए यह सही ढंग से मानता है कि इसे परिणाम पर जोर देना चाहिए। .. कम से कम यही ऐसा लगता है।

+0

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

3

@ रेनाटो अपनी प्रतिक्रिया के संपादित हिस्से में सही है - एक शून्य विधि पर आपका कॉल स्पॉक द्वारा जोर दिया जाता है क्योंकि यह एक गतिशील कॉल है और स्पॉक यह समझने में सक्षम नहीं है कि आप एक शून्य विधि और उत्सुकता से दावा कर रहे हैं कॉल। यदि आपने अपना कोड बदल दिया है:

class NavigationSpec extends GebSpec { 

    def 'Collections page has a right header'() { 
     when: 
      CollectionsPage collectionsPage = to CollectionsPage 

     then: 
      collectionsPage.hasHeaderText('Collections') 
    } 

} 

तो यह जोर नहीं दिया जाएगा।

+0

उत्तर के लिए धन्यवाद मानता हूं। मुझे पूरा यकीन था कि यह कॉल की कुछ गतिशील प्रकृति के कारण है। विचित्र रूप से मैंने इसे पकड़ नहीं लिया है अगर सीधे स्वामित्व वाली वस्तु पर आक्रमण किया जाता है। वैसे, मुझे किस जवाब को स्वीकार करना चाहिए? @Renato पहले था जबकि आपका अधिक विवरण देता है :) – topr

+1

शायद @Renato एक स्वीकृति के योग्य है क्योंकि उसकी प्रतिक्रिया पहली सही थी। :) – erdi

+0

आप बहुत विनम्र हैं। @ रेनाटो प्रतिक्रिया मेरी अपनी धारणाओं की एक सामान्य पुष्टि थी कि यह 'कुछ गतिशील जादू' है, लेकिन न तो क्या हो रहा है और न ही समाधान के बारे में कोई विवरण नहीं दिया गया था। इस प्रकार, मैं तुम्हारा स्वीकार कर रहा हूँ। मुझे उम्मीद है कि वह दिमाग में नहीं है ... – topr

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