2011-10-21 12 views
7

मैं वर्तमान में परीक्षण चला कि तरह लग रहे कॉल परीक्षण करने के लिए निम्नलिखित:moq का उपयोग कैसे करें कोड है कि संरक्षित सहायकों

// In Blah.cs 
public class ClassUnderTest 

{ 

    public bool MethodUnderTest() 

    { 

     // Do a bunch of stuff... 

     return HelperMethod(); 

    } 



    protected virtual bool HelperMethod() 

    { 

     bool success = false; 

     // Proprietary Hardware Access. 

     // Database Calls. 

     // File System Modifications. 

     return success; 

    } 

} 


// In TestBlah.cs 

public class TestStub : ClassUnderTest 

{ 

    public bool HelperMethodReturnValue; 



    protected override bool HelperMethod() 

    { 

     return HelperMethodReturnValue; 

    } 

} 



[TestClass] 

public class TestingClass 

{ 

    [TestMethod] 

    public void ClassUnderTest_MethodUnderTest_TestHelperReturnsTrue() 

    { 

     var stub = new TestStub(); 

     stub.HelperMethodReturnValue = true; 

     Assert.IsTrue(stub.MethodUnderTest()); 

    } 



    [TestMethod] 

    public void ClassUnderTest_MethodUnderTest_TestHelperReturnsFalse() 

    { 

     var stub = new TestStub(); 

     stub.HelperMethodReturnValue = false; 

     Assert.IsFalse(stub.MethodUnderTest()); 

    } 

} 

ऊपर सरल बातों के लिए ठीक लग रहा है, फिर भी ठूंठ वर्ग तेजी से बड़ा और अधिक जटिल हो जाता है जल्दी से । मैं Moq का उपयोग कर स्टब क्लास को प्रतिस्थापित करना चाहता हूं। हालांकि यह संकलित नहीं होगा क्योंकि किसी कारण से मैं संरक्षित विधि पर वापसी मूल्य निर्धारित नहीं कर सकता।

[TestMethod] 

public void ClassUnderTest_MethodUnderTest_TestHelperReturnsFalse() 

{ 

    var mockClass = new Mock<ClassUnderTest>(); 
    mockClass.Protected().Setup("HelperMethod").Returns(false); 

    Assert.IsFalse(mockClass.Object.MethodUnderTest()); 

} 

कोई भी जानता है कि मैं यह करने के बारे में कैसे जाऊंगा? क्या मैं moq के साथ ऐसा कर सकता हूँ?

+5

कुछ ठीक नहीं लगता है ... आप अपने एसयूटी का मज़ाक उड़ाते हैं, आप इसकी निर्भरताओं का मज़ाक उड़ाते हैं। –

+0

हाँ, वास्तव में योजिन एसयूटी के एक हिस्से को प्रतिस्थापित करने के लिए एसयूटी को झुकाता है जिसे संरक्षित सहायक विधि में अलग नहीं रखा जाना चाहिए। – Matthias

उत्तर

23

moq source code पर देखकर मैं अनुमान आपको स्पष्ट रूप से सेटअप के सामान्य संस्करण को कॉल करने की आवश्यकता है। गैर-जेनेरिक संस्करण शून्य विधियों के लिए उपयोग किया जाता प्रतीत होता है। तो

mockClass.Protected().Setup<bool>("HelperMethod").Returns(false); 

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

4

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

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