2012-06-11 7 views
7

मैं स्कैला (जावा से) में नया हूं और मुझे टीडीडी/बीडीडी विकसित करना पसंद है। तो स्कैला के बारे में बहुत कुछ जानने से पहले मैं पहले से ही स्केलेटेस्ट में डाला गया हूं।स्कैला - यूनिट परीक्षण सेटअप (एक्सेस मॉडिफायर क्वालीफायर का उपयोग करें?)

मैं सोच रहा हूं कि यूनिट परीक्षण के लिए एक अच्छी पहुंच रणनीति क्या है, इस दृष्टिकोण से कि आप जितना संभव हो परीक्षण करना चाहते हैं।

मान लीजिए कि मेरे पास एक कक्षा विश्व है जिसे मैं परीक्षण करना चाहता हूं और एक क्लास एजेंट जो दुनिया के बारे में सब कुछ नहीं जानना चाहिए।

package program { 
    package world { 
    class World { 
     private var notForAgent 
     def forAgentDuringActing 
     // forAgentDuringActing has an important side effect in notForAgent 
    } 
    } 

    package agent { 
    class Agent 
    // would call World.forAgentDuringActing 
    } 

    package world.test { 
    class WorldSpec extends FunSpec { 
     describe("The world") { 
     it("should have side-effect behaviour when the agent acts on it") { 
      // ... the test ... 
     } 
     } 
    } 
    } 
} 

ध्यान दें कि ये पैकेज घोषणाएं मेरे लिए पवित्र नहीं हैं। मैं वास्तव में क्या चाहूंगा, यह है कि वर्ल्डस्पेक दुनिया के लिए एक साथी वस्तु की तरह कुछ होगा, ताकि वह दुष्प्रभाव के लिए परीक्षण कर सके।

मैंने सोचा कि शायद मॉडिफायर क्वालीफायर एक्सेस करने में मदद मिलेगी। मैं private[world] notForAgent कह सकता था, लेकिन वास्तव में यह मेरी अपेक्षा से अधिक पहुंच है। मैं वास्तव में क्या चाहता हूं private[this, test.WorldSpec] notForAgent जैसा कुछ है, लेकिन मुझे नहीं लगता कि कई क्वालीफायरों की अनुमति है।

यह टेस्ट करने योग्य बनाने के लिए आप क्या करेंगे? वैकल्पिक रूप से, क्या आप संकेत दे सकते हैं कि मेरे विचार गलत दिशा में कहां जाते हैं?

पेज। मुझे बयान "निजी परीक्षण कभी नहीं" पता है। लेकिन मुझे यह भी पता है कि "परीक्षण कोड से ही अधिक महत्वपूर्ण है। परीक्षण के लिए आवश्यक होने पर एक्सेस मॉडिफायर को बदलें"। हालांकि, मैं इस धागे में उस चर्चा से बचना चाहता हूं।

उत्तर

9

यदि आप "निजी तरीकों का परीक्षण कैसे करें?" पूछ रहे हैं, तो स्कैलास्ट वास्तव में इसका समर्थन करता है। here देखें।

class C { 
    private def m(x: Int) = x 
} 

class CTests extends /*any test suite you like*/ with PrivateMethodTester { 
    val decoratedM = PrivateMethod[Int]('m) 
    val c = new C 
    val actual = c invokePrivate decoratedM(4711) 
    val expected = 4711 
    actual should be(expected) // this line depends on the test suite you've chosen 
} 
+0

हाँ, मुझे इसके बारे में पता था। हालांकि, जिस राज्य में मैं परीक्षण करना चाहता हूं वह एक वैर में है, न कि एक विधि। फिर भी, आपका जवाब वास्तव में प्रयोग योग्य है, क्योंकि स्पष्ट रूप से स्कैला भी एक निजी मूल्य के लिए गेटटर विधि बनाता है। तो आप इस तरह से परीक्षण कर सकते हैं। हालांकि इसे एक अधिक प्राकृतिक तरीके से अनुमति देने का कोई तरीका नहीं होगा (जैसे कि साथी वस्तु के मामले में)? – qkrijger

+0

हम्म, मैं आपके उत्तर को वोट नहीं दे सकता क्योंकि मेरे पास अभी तक 15 प्रतिष्ठा नहीं है ... :( – qkrijger

+0

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

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