Moq में उस विधि को कैसे सत्यापित किया जाए?


466

मैं यह कैसे सत्यापित करूँ कि विधि को Moq में नहीं बुलाया गया था ?

क्या यह AssertWasNotCalled जैसा कुछ है?

अद्यतन: संस्करण 3.0 से शुरू, एक नया वाक्यविन्यास इस्तेमाल किया जा सकता है:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

जवाबों:


155

अद्यतन : संस्करण 3 के बाद से, ऊपर दिए गए प्रश्न या नीचे दिए गए Dann के उत्तर के लिए अद्यतन की जाँच करें।

या तो, अपने नकली को सख्त बनाएं ताकि यदि आप एक ऐसी विधि कहते हैं जिसके लिए आपको कोई उम्मीद नहीं है तो यह विफल हो जाएगा

new Mock<IMoq>(MockBehavior.Strict)

या, यदि आप चाहते हैं कि आपका नकली ढीला हो, तो .Throws (अपवाद) का उपयोग करें

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
... या कॉलबैक () कुछ ध्वज सेट करने के लिए जिसे मुखर किया जा सकता है।
एलेक्स

2
विकल्प # 2 के साथ, आप एक सामान्य Teardown विधि में VerifyAll नहीं कर सकते हैं - यह यह कहते हुए विफल हो जाएगा कि अपेक्षा पूरी नहीं हुई थी; जब परीक्षा आदर्श रूप से पास होनी चाहिए।
शिशु

51
यह वास्तव में एक "सत्यापित नहीं कहा जाता है" है क्योंकि यह विधि के भीतर पकड़ा जा सकता है और फिर भी काम करेगा - एक झूठी सकारात्मक प्रदान करता है!
दान

4
उम्मीद अब कम हो गई है
टॉमस सिकोरा

5
यह 2009 में सबसे अच्छा संभव तरीका हो सकता है, लेकिन निश्चित रूप से अब नहीं। क्षमा करें
फेबियो मिल्हीरो

537

परीक्षण के बाद एक सत्यापन चलाएं जिसमें ए है Times.Never एनुम सेट है। जैसे

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
यहां जो महत्वपूर्ण है, वह यह है कि मॉक को भेजे जाने के बाद वेरिफाई (एक्शन, नेवर) कॉल । मैंने सोचा कि यह वेरिफाई ऑल () बाद में कॉल करने के लिए सत्यापन स्थापित कर रहा है (जो काम नहीं करता)
piers7

सरल और प्रभावी। धन्यवाद।
इयान ग्रिंजर

45

चोरी से: जॉन फोस्टर के सवाल का जवाब, "मो को बेहतर समझने में मदद की ज़रूरत है"

जिन चीजों का आप परीक्षण करना चाहते हैं, उनमें से एक यह है कि भुगतान विधि को कॉल नहीं किया जाता है जब 65 वर्ष से अधिक आयु के व्यक्ति को विधि में पारित किया जाता है

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock<IPensionService>();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

10

यह Moq के हाल के संस्करणों में काम नहीं करता है (कम से कम 3.1 के बाद से), इसे Verifyविधि में निर्दिष्ट किया जाना चाहिए जैसा कि उत्तर में वर्णित है।

दरअसल, .AtMost(0)रिटर्न स्टेटमेंट के बाद इसे निर्दिष्ट करना बेहतर है ।

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

यद्यपि "थ्रो" भी काम करता है, AtMost(0)अधिक अभिव्यंजक IMHO है।


-5

उपयोग करें ।AtMostOnce ();

असली परीक्षा के बाद, विधि को फिर से कॉल करें। यदि यह एक अपवाद फेंकता है, तो इसे बुलाया गया था।


1
क्या थोड़ा बहुत अस्पष्ट नहीं है, यह दावा करने के लिए कि अपवाद को नकली रूपरेखा द्वारा फेंक दिया गया था?
एलेक्स

क्यों? केवल अपवाद के प्रकार की जांच करें। अगर यह एक मेरे Moq फेंक दिया है, तो आप सुरक्षित हैं।
आरोन दिगुल्ला

8
Times.Never के साथ सत्यापन का उपयोग करना एक बेहतर विकल्प है ... मैं एलेक्स से सहमत हूं कि यह समाधान काम करता है, लेकिन निश्चित रूप से अस्पष्ट है।
बीप बीप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.