2013-03-12 3 views
22

यदि आपको रिटर्न वैल्यू सेट अप करने की आवश्यकता है, साथ ही सत्यापित करें कि अभिव्यक्ति को कितनी बार बुलाया गया था, तो क्या आप इसे एक कथन में कर सकते हैं?Moq - क्या सत्यापित मानदंड सेटअप (उदाहरण के लिए टाइम्स कहा जाता है) में निर्दिष्ट करना संभव है?

जो मैं इकट्ठा कर सकता हूं, मोक के सेटअप (कुछ एक्स्प्रेसियन)। सत्यापित() Verify() के साथ बुलाया जाता है, मूल रूप से एक सत्यापन (SomeExpression, Times.AtLeastOnce) करता है? यानी यह अभिव्यक्ति केवल अभिव्यक्ति कहलाती थी।

प्रश्न को बेहतर तरीके से समझाने के लिए यहां एक उदाहरण दिया गया है। एक इंटरफ़ेस के लिए:

interface IFoo 
{ 
    int ReturnSomething(); 
} 

क्या निम्नलिखित दो ब्लॉक समकक्ष हैं (पहले के अलावा सभी सेटअप सत्यापित किए गए सत्यापन के रूप में चिह्नित किए गए हैं)?

void Test() 
{ 
    var mock = new Mock<IFoo>(); 
    mock.Setup((m) => m.ReturnSomething()).Returns(1).Verifiable(); 

    mock.Verify(); 
} 

और

void Test() 
{ 
    var mock = new Mock<IFoo>(); 
    mock.Setup((m) => m.ReturnSomething()).Returns(1); 

    mock.Verify((m) => m.ReturnSomething(), Times.AtLeastOnce()); 
} 

अगर मैं कॉल की संख्या (जैसे कि दो बार), इस एक ही रास्ता है, जहां अभिव्यक्ति सेटअप के लिए बार-बार और सत्यापित है सत्यापित करने के लिए चाहते थे?

void Test() 
{ 
    var mock = new Mock<IFoo>(); 
    mock.Setup((m) => m.ReturnSomething()).Returns(1); 

    mock.Verify((m) => m.ReturnSomething(), Times.Exactly(2)); 
} 

मुझे बस सेटअप और सत्यापन करने की आवश्यकता नहीं है। खैर, चूंकि यह एएए के लिए एक अच्छा विचार है, फिर से बदलने के लिए, मुझे सेटअप और सत्यापन के लिए अभिव्यक्ति दोहराना पसंद नहीं है। फिलहाल मैं अभिव्यक्ति को एक चर में संग्रहीत करता हूं और इसे प्रत्येक विधि में पास करता हूं, लेकिन इतना साफ महसूस नहीं करता है।

पुनश्च - इस के लिए संदर्भ (निश्वासित आदि) जब एक कैश या अपडेट नहीं होने पर एक परीक्षण जांच के लिए है

+0

यह मोक 4 का उपयोग कर रहा है (मैंने पुराने कोड स्निपेट्स को देखा है जहां आईटेटअप पर एटमोस्टऑन्स जैसे विधियां हैं) – GregS

उत्तर

10

पहले सवाल का जवाब करने के लिए, हाँ दो ब्लॉकों के बराबर हैं। दोनों .Verify को तब विफल कर देंगे जब नकली विधि को कॉल नहीं किया गया था।

आप जहां तक ​​मुझे पता है और यदि आप इसके बारे में सोचते हैं, तो आप ऊपर की पुष्टि सत्यापित नहीं कर सकते हैं, यह समझ में आता है।

mock.Setup(m => m.ReturnSomething()).Returns(1); 

यह फोन करने वाले के व्यवहार की पुष्टि करने जाता है::

mock.Verify(m => m.ReturnSomething(), Times.AtLeastOnce()); 

व्यक्तिगत तौर पर मैं फोन करने वाले के लिए आवश्यक व्यवहार की पुष्टि करने के लिए व्यक्तिगत रूप से सत्यापित कर बुला पसंद करते हैं

यह नकली के व्यवहार को निर्दिष्ट किया जाता है , .Verifiable() और .Verify() शॉर्टकट हैं जो कम सख्त हैं (वे सिर्फ यह जांचते हैं कि विधि को एक या अधिक बार कहा जाता था) हालांकि यदि आपको पता है कि आपका कोड केवल एक विधि को कॉल करना चाहिए, तो पुष्टि करने के लिए अंत में सत्यापित करें।

मैंने कोड विलय के बाद दो बार बुलाए जाने के बाद ऐसा करना शुरू कर दिया, परीक्षण अभी भी पारित हो गया क्योंकि इसे कम से कम एक बार बुलाया गया था, लेकिन इसका मतलब यह भी था कि कुछ और बार हुआ जो कि नहीं होना चाहिए!

+0

यह दुर्भाग्यपूर्ण है कि राइनो मोक्स सेटअप का समर्थन करता है और एक ही कथन में सत्यापित करता है। मुझे लगता है कि यह सबसे आम उपयोग-मामलों में से एक होगा (यदि _the_ सबसे आम नहीं है), तो मुझे परेशान है कि यह तीन साल बाद भी ढांचे में शामिल नहीं है। मान लीजिए कि मैं राइनो मोक्स पर स्विच करूंगा ... –

10

मुझे यह समस्या हर समय है। मैं सख्त मैक्स का उपयोग करता हूं, और मैं सख्ती से निर्दिष्ट करना चाहता हूं (यानी मैंने It.IsAny() के बजाय It.Is<>() का उपयोग किया) साथ ही कड़ाई से सत्यापित (यानी टाइम्स निर्दिष्ट करना) सत्यापित किया। आप इसके लिए दुखद रूप से उपयोग नहीं कर सकते हैं, क्योंकि मोक में Verifiable(Times) अधिभार गुम है।

It.Is<>() सहित कॉल की पूरी अभिव्यक्ति आम तौर पर बड़ी है।तो क्रम दोहराव से बचने के लिए मैं आम तौर पर निम्नलिखित का सहारा:

Expression<Action<MockedType>> expression = mockedTypeInstance => mockedTypeInstance.MockedMethod(It.Is<TFirstArgument>(firstArgument => <some complex statement>)/*, ...*/); 
_mock.Setup(expression); 

/* run the test*/ 

_mock.Verify(expression, Times.Once); 

नहीं अत्यंत पठनीय है, लेकिन मुझे नहीं लगता कि दोनों सख्त सेटअप और सख्त सत्यापन का उपयोग करने के लिए एक और तरीका है।

+0

पुन: उपयोग करने के लिए एक अलग अभिव्यक्ति का उपयोग जो मुझे चाहिए उस पर अच्छा लगा। अच्छा समाधान! –

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