सवाल केवल कुछ तरीकों का नकल करने के लिए moq का उपयोग करना


मेरे पास निम्न विधि है:

public CustomObect MyMethod()
{
    var lUser = GetCurrentUser();
    if (lUser.HaveAccess)
    {
        //One behavior
    }
    else 
    {
        //Other behavior
    }

    //return CustomObject
}

मैं नकली करना चाहता हूँ IMyInterface.GetCurrentUser, ताकि कॉल करते समय MyMethod मैं इसे जांचने के लिए कोड पथों में से एक प्राप्त कर सकता हूं। मोक के साथ ऐसा कैसे करें?

मैं निम्नलिखित बात कर रहा हूं:

var moq = new Mock<IMyInterface>();            
moq.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);

//act
var lResult = moq.Object.MyMethod();

लेकिन किसी कारण से lResult हमेशा है null और जब मैं अंदर आने की कोशिश कर रहा हूं MyMethod डीबग में मैं हमेशा अगले कथन पर जा रहा हूं।


44
2018-01-22 19:06


मूल


आपने कहा lUnauthorizedUser प्रारंभ? मुझे लगता है कि आप कुछ पसंद करेंगे moq.Setup(x => x.GetCurrentUser()).Returns(new User() { HaveAccess = false }); - Tyler Treat
टायलर, यकीन है कि मैंm setting it in the above code, just didnकोड को छोटा रखने के लिए इसे चिपकाया नहीं है। - Yaroslav Yakovlev


जवाब:


इसे आंशिक नकली कहा जाता है और जिस तरह से मुझे moq में ऐसा करने के बारे में पता है, उसे इंटरफ़ेस की बजाय कक्षा का मज़ाक उड़ाते हैं और फिर "मैक ऑब्जेक्ट" पर "कॉलबेस" संपत्ति को "सत्य" पर सेट करने की आवश्यकता होती है।

इसके लिए कक्षा के सभी विधियों और गुणों को वर्चुअल परीक्षण करने की आवश्यकता होगी। मान लीजिए यह कोई समस्या नहीं है, फिर आप इस तरह एक परीक्षण लिख सकते हैं:

 var mock = new Mock<YourTestClass>();
 mock.CallBase = true;
 mock.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);
 mockedTest.Object.MyMethod();

92
2018-01-22 23:06



बहुत बढ़िया! बहुत बहुत धन्यवाद, नहींt think itयह इतना आसान है। - Yaroslav Yakovlev
एक आकर्षण की तरह काम !!! - Sarawut Positwinyu
मैंने समान जवाब देखा है, लेकिन वे सेट करने के लिए उल्लेख करना भूल जाते हैं CallBase सच करने के लिए, आवश्यक हिस्सा veeerrrry, धन्यवाद! - Mike de Klerk


पर विस्तार ली का जवाब,

आपको अपने वर्ग वर्चुअल पर केवल सभी विधियों और गुणों को बनाने की आवश्यकता नहीं है, केवल वही जिन्हें आप नकल करना चाहते हैं।

साथ ही, यह ध्यान दिया जाना चाहिए कि आपको अपनी कक्षा के ठोस कार्यान्वयन का मज़ाक उड़ाया जाना चाहिए।

var mock = new Mock<YourTestClass>(); // vs. var mock = new Mock<IYourTestInterface>();

यदि आपकी कक्षा में डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, तो आपको इसके माध्यम से पास करने के लिए तर्क निर्दिष्ट करने की भी आवश्यकता होगी:

var mock = new Mock<YourTestClass>(x, y, z);
// or
var mock = new Mock<YourTestClass>(MockBehavior.Default, x, y, z);

कहा पे x, y, z क्रमशः आपके कन्स्ट्रक्टर के लिए पहला, दूसरा और तीसरा पैरामीटर हैं।

और आखिरकार, यदि आप जिस मॉक को देख रहे हैं वह सुरक्षित है तो आपको शामिल करने की आवश्यकता होगी Moq.Protected

using Moq.Protected;

TReturnType returnValue = default(TReturnType);

mock.Protected()
    .Setup<TReturnType>("YourMockMethodName", It.IsAny<int>()) // methodname followed by arguments
    .Returns(returnValue);

16
2018-05-16 14:15



यह ध्यान देने योग्य है कि आप इसका उपयोग कर सकते हैं nameof(YourTestClass.YourMockMethodName) "YourMockMethodName" के बजाय। इसके कारण जब आप रीफैक्टर विधि नाम परीक्षण अभी भी काम करेंगे। - Shoter


मेरे पास एक समान मामला था। मैंने पाया कि निम्नलिखित कोड ने मुझे इंटरफ़ेस के कुछ विशिष्ट कार्यान्वयन से मॉक किए गए तरीकों और वास्तविक विधियों दोनों का उपयोग करने के लिए और अधिक लचीलापन दिया है:

var mock = new Mock<ITestClass>(); // Create Mock of interface

// Create instance of ITestClass implementation you want to use
var inst = new ActualTestClass();

// Setup to call method of an actual instance
// if method returns void use mock.Setup(...).Callback(...)
mock.Setup(m => m.SomeMethod(It.IsAny<int>())
    .Returns((int x) => inst.SomeMethod(x));

अब आप वास्तविक विधि का उपयोग कर सकते हैं लेकिन यह सत्यापित करने के लिए सत्यापित करें कि कितनी बार इसे बुलाया गया है।


10
2018-06-21 18:51



वह सर .... चारों ओर एक दिलचस्प काम है: डी - ppumkin
यह वास्तव में दिलचस्प काम है, हम वर्ग विधि के आभासी किए बिना इसे प्राप्त कर सकते हैं। - Harshad Vekariya
उन तरीकों के बारे में कैसे जो शून्य लौटते हैं? नकली वस्तु पर रिटर्न पर कॉल करने के लिए कॉल नहीं किया जाएगा? mock.Setup (m => m.SomeMethod (it.IsAny <int> ())। पुनर्नवीनीकरण ((int x) => inst.SomeMethod (x)); - Bendram