Moq का उपयोग करके विधि कॉल को सत्यापित करें


142

मैं C # में इकाई परीक्षण के लिए काफी नया हूं और Moq का उपयोग करना सीख रहा हूं। नीचे वह वर्ग है जिसे मैं परखने की कोशिश कर रहा हूं।

class MyClass
{
    SomeClass someClass;
    public MyClass(SomeClass someClass)
    {
        this.someClass = someClass;     
    }

    public void MyMethod(string method)
    {
        method = "test"
        someClass.DoSomething(method);
    }   
}

class Someclass
{
    public DoSomething(string method)
    {
        // do something...
    }
}

नीचे मेरा TestClass है:

class MyClassTest
{
    [TestMethod()]
    public void MyMethodTest()
    {
        string action="test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
        mockSomeClass.SetUp(a => a.DoSomething(action));
        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);
        mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
    }
}

मुझे निम्न अपवाद मिले:

Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..

मैं सिर्फ यह सत्यापित करना चाहता हूं कि क्या विधि "MyMethod" को बुलाया जा रहा है या नहीं। क्या मैं कुछ भूल रहा हूँ?


1
यदि SomeClassयह परिभाषा नहीं है, तो यह संकलित नहीं करेगा कि MyMethod(string)यह कैसा दिखता है।
प्लेटिनम अज़ुरे

क्षमा करें .. मैंने अपना प्रश्न संपादित किया ..
user591410

1
आप सही रास्ते पर हैं, लेकिन पोस्ट किए गए कोड में बग हैं। यह संकलित नहीं करेगा - Someclass पर आवरण, DoSomething पर शून्य वापसी। उसके बाद आपको सार्वजनिक पहुंच की आवश्यकता है, फिर DoSomething वर्चुअल करें। संक्षेप में, आपके पास अपने उत्पादन कोड में भी एक बग है।
ट्रूविल

आपके प्रतिक्रिया के लिए धन्येवाद। मैं नकली विधि सेट करते समय तर्क गलत कर रहा था ..
user591410

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

जवाबों:


209

आप गलत पद्धति की जाँच कर रहे हैं। Moq की आवश्यकता है कि आप निर्भरता वर्ग में विधि सेटअप (और फिर वैकल्पिक रूप से सत्यापित करें) करें।

आपको कुछ इस तरह करना चाहिए:

class MyClassTest
{
    [TestMethod]
    public void MyMethodTest()
    {
        string action = "test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();

        mockSomeClass.Setup(mock => mock.DoSomething());

        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);

        // Explicitly verify each expectation...
        mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once());

        // ...or verify everything.
        // mockSomeClass.VerifyAll();
    }
}

दूसरे शब्दों में, आप उस कॉल को सत्यापित कर रहे हैं MyClass#MyMethod, आपकी कक्षा निश्चित रूप SomeClass#DoSomethingसे उस प्रक्रिया में एक बार कॉल करेगी । ध्यान दें कि आपको Timesतर्क की आवश्यकता नहीं है; मैं बस इसके मूल्य का प्रदर्शन कर रहा था।


क्षमा करें, मैंने अपने प्रश्न को सही विधि से संपादित किया। जैसा कि आपने उल्लेख किया है, मैंने पहले सेटअप की कोशिश की और फिर वेरिफाई किया। यह अभी भी मुझे वही अपवाद देता है।
user591410

22
क्या किसी अपेक्षा को स्थापित करना निरर्थक नहीं है, फिर उसी अपेक्षा को स्पष्ट रूप से सत्यापित करें? mockSomeClass.VerifyAll();एक ही परिणाम प्राप्त नहीं होगा और अधिक DRY होगा?
टिम लॉन्ग

14
हां, लेकिन यह स्पष्ट है कि कुछ लोग इसके पक्ष में हैं।
प्लैटिनम एज़्योर

3
कम से कम VerifyAll () का उल्लेख करने के लिए धन्यवाद; स्पष्ट रूप से एक बार जब आप इसके बारे में सोचते हैं। मैं स्पष्ट दृष्टिकोण के लिए गया था, लेकिन सभी का उपयोग करते समय बहुत क्लीनर। आभारी दोनों सूचीबद्ध हैं।
20

1
Mockइसकी तुलना में एक संबंधित नुकसान NSubstituteयह है कि यदि आप मापदंडों को सत्यापित करने का प्रयास कर रहे हैं और सत्यापन विफल हो जाता है, तो यह सिर्फ दिखाता है कि इनवोकेशन क्या किया गया था, लेकिन यह नहीं दिखाता है कि अगर आप सत्यापन अभिव्यक्ति में चर का उपयोग करते हैं तो वास्तव में क्या उम्मीद थी - यह सिर्फ चर दिखाएगा नाम, इसका मूल्य नहीं, इसलिए आपको यह जाँचने के लिए डिबग करने की आवश्यकता होगी कि वास्तव में वह चर क्या है। NSubstitute सिर्फ दोनों के मूल्यों को दिखाएगा और यहां तक ​​कि जहां यह अलग था।
ग्रेंगस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.