2012-07-28 6 views
9

मैं एक वर्गMoq का उपयोग कर पूरे वर्ग की बजाय कक्षा पर एक विधि नकली?

public interface IMyInterface 
{ 
    string MethodA(); 
    void MethodB(); 
} 

public class MyClass : IMyInterface 
{ 
    public string MethodA() 
    { 
     // Do something important 
    } 

    public void MethodB() 
    { 
     string value = MethodA(); 
     // Do something important 
    } 
} 

मैं इकाई परीक्षण MethodB करना चाहते हैं, लेकिन मैं मुसीबत मैं MethodA कैसे नकली कर सकते हैं, जबकि अभी भी MethodB में बुला Moq का उपयोग कर के बारे में सोच रही है। Moq इंटरफ़ेस mocks, वर्ग नहीं, तो मैं सिर्फ mock.Object.MethodB() पर कॉल नहीं कर सकता, है ना?

क्या यह संभव है? यदि हां, तो कैसे?

+1

एक टिप्पणी: वास्तव में मोक का उपयोग करके आप कक्षा का मज़ाक उड़ा सकते हैं लेकिन कक्षाओं पर कुछ आवश्यकताएं हैं। कक्षा को सील नहीं किया जा सकता है। और मॉक किए जाने की विधि को वर्चुअल के रूप में चिह्नित किया जाना चाहिए। यह स्थिर विधि भी नहीं हो सकता है। – Artiom

उत्तर

4

मुझे नहीं लगता कि यह संभव है। यहां तक ​​कि यह संभव है कि मैं ऐसा नहीं करना चाहूंगा।

आप MyClass के व्यवहार का परीक्षण कर रहे हैं, तथ्य यह है कि IMyInterface लागू करने के लिए यह कुछ विधि विधि और विधि बी के परीक्षण व्यवहार से संबंधित नहीं है। आपके पास अलग-अलग परीक्षण हो सकते हैं जो सुनिश्चित करता है कि कक्षा इंटरफ़ेस लागू करती है जिसे आप आवश्यक होने पर लागू करने की अपेक्षा करते हैं। MyClass.MethodB का परीक्षण MyClass के उदाहरण पर किया जाना चाहिए, अर्द्ध-मॉक ऑब्जेक्ट पर नहीं।

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

1

नकली निर्भरताएं आप आसानी से (या सभी) को कम नहीं कर सकते हैं।
MyClass परीक्षा के तहत कक्षा है, इसलिए मजाक नहीं किया जाना चाहिए (आप मॉक किए गए मानों का परीक्षण नहीं करना चाहते हैं)।
लेकिन, यदि आपके पास MyClass.Foo संपत्ति है जो Foo है जो IFoo इंटरफ़ेस लागू करती है और MethodA इस Foo संपत्ति का उपयोग करती है, तो आप निर्भरता को तोड़ने के लिए इसे मॉक कर सकते हैं।

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