जवाबों:
अद्यतन : संस्करण 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."));
परीक्षण के बाद एक सत्यापन चलाएं जिसमें ए है Times.Never
एनुम सेट है। जैसे
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
चोरी से: जॉन फोस्टर के सवाल का जवाब, "मो को बेहतर समझने में मदद की ज़रूरत है"
जिन चीजों का आप परीक्षण करना चाहते हैं, उनमें से एक यह है कि भुगतान विधि को कॉल नहीं किया जाता है जब 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()); }
यह Moq के हाल के संस्करणों में काम नहीं करता है (कम से कम 3.1 के बाद से), इसे
Verify
विधि में निर्दिष्ट किया जाना चाहिए जैसा कि उत्तर में वर्णित है।
दरअसल, .AtMost(0)
रिटर्न स्टेटमेंट के बाद इसे निर्दिष्ट करना बेहतर है ।
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
यद्यपि "थ्रो" भी काम करता है, AtMost(0)
अधिक अभिव्यंजक IMHO है।
उपयोग करें ।AtMostOnce ();
असली परीक्षा के बाद, विधि को फिर से कॉल करें। यदि यह एक अपवाद फेंकता है, तो इसे बुलाया गया था।