मैं सत्यापित करता हूं कि Moq के साथ एक बार एक विधि को कैसे सत्यापित किया जाता है? Verify()
बनाम Verifable()
बात वास्तव में भ्रमित कर रहा है।
मैं सत्यापित करता हूं कि Moq के साथ एक बार एक विधि को कैसे सत्यापित किया जाता है? Verify()
बनाम Verifable()
बात वास्तव में भ्रमित कर रहा है।
जवाबों:
आप उपयोग कर सकते हैं Times.Once()
, या Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
यहाँ टाइम्स वर्ग पर तरीके हैं :
AtLeast
- निर्दिष्ट करता है कि एक नकली विधि को न्यूनतम के रूप में कई बार लागू किया जाना चाहिए।AtLeastOnce
- निर्दिष्ट करता है कि एक नकली विधि को न्यूनतम के रूप में एक बार लागू किया जाना चाहिए।AtMost
- निर्दिष्ट करता है कि एक नकली विधि को अधिकतम समय के लिए लागू किया जाना चाहिए।AtMostOnce
- निर्दिष्ट करता है कि एक नकली विधि को अधिकतम के रूप में एक बार लागू किया जाना चाहिए।Between
- निर्दिष्ट करता है कि एक नकली विधि को और समय के बीच में लागू किया जाना चाहिए।Exactly
- निर्दिष्ट करता है कि एक नकली विधि को कई बार सही तरीके से लागू किया जाना चाहिए।Never
- निर्दिष्ट करता है कि नकली विधि को लागू नहीं किया जाना चाहिए।Once
- निर्दिष्ट करता है कि एक नकली विधि को ठीक एक बार लागू किया जाना चाहिए।बस याद रखें कि वे विधि कॉल हैं; मैं सोचता रहा कि वे गुण हैं और कोष्ठकों को भूलते जा रहे हैं।
var mockContext = new Mock<IContext>()
सेट अप करने जैसा कुछ था ।
AtLeast
, AtMost
, Between
, या Exactly
संपत्ति के रूप में देखा जा सकता है। मेरा मतलब है, उन्हें कुछ करने के लिए एक पैरामीटर की आवश्यकता है।
कल्पना कीजिए कि हम 2 पूर्णांक जोड़ने के लिए एक विधि के साथ एक कैलकुलेटर का निर्माण कर रहे हैं। आइए आगे आवश्यकता की कल्पना करते हैं कि जब ऐड विधि को कॉल किया जाता है, तो यह प्रिंट विधि को एक बार कॉल करता है। यहां बताया गया है कि हम इसका परीक्षण कैसे करेंगे:
public interface IPrinter
{
void Print(int answer);
}
public class ConsolePrinter : IPrinter
{
public void Print(int answer)
{
Console.WriteLine("The answer is {0}.", answer);
}
}
public class Calculator
{
private IPrinter printer;
public Calculator(IPrinter printer)
{
this.printer = printer;
}
public void Add(int num1, int num2)
{
printer.Print(num1 + num2);
}
}
और यहाँ आगे स्पष्टीकरण के लिए कोड के भीतर टिप्पणियों के साथ वास्तविक परीक्षा है:
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void WhenAddIsCalled__ItShouldCallPrint()
{
/* Arrange */
var iPrinterMock = new Mock<IPrinter>();
// Let's mock the method so when it is called, we handle it
iPrinterMock.Setup(x => x.Print(It.IsAny<int>()));
// Create the calculator and pass the mocked printer to it
var calculator = new Calculator(iPrinterMock.Object);
/* Act */
calculator.Add(1, 1);
/* Assert */
// Let's make sure that the calculator's Add method called printer.Print. Here we are making sure it is called once but this is optional
iPrinterMock.Verify(x => x.Print(It.IsAny<int>()), Times.Once);
// Or we can be more specific and ensure that Print was called with the correct parameter.
iPrinterMock.Verify(x => x.Print(3), Times.Once);
}
}
नोट : डिफ़ॉल्ट रूप से जैसे ही आप एक Mock ऑब्जेक्ट बनाते हैं, सभी गुण और विधियों को रोक देंगे। तो बिना कॉल किए भी Setup
, Moq ने पहले ही तरीके बता दिए हैं, IPrinter
ताकि आप कॉल कर सकें Verify
। हालांकि, एक अच्छे अभ्यास के रूप में, मैं हमेशा इसे सेट करता हूं क्योंकि हमें कुछ अपेक्षाओं को पूरा करने के लिए विधि को लागू करने की आवश्यकता हो सकती है, या कुछ उम्मीदों को पूरा करने के लिए विधि से वापसी मूल्य या कई बार इसे बुलाया गया है।
Verify
, Times.Once
बिना कभी बुलाए Setup
। मैं निश्चित रूप Verify
से उस मामले में झटका देने की उम्मीद करूंगा , लेकिन ऐसा नहीं हुआ।
Mock
ऑब्जेक्ट बनाते हैं, सभी गुणों और विधियों को रोक देंगे । तो बिना कॉल किए भी Setup
, Moq ने पहले ही तरीके बता दिए हैं, IPrinter
ताकि आप कॉल कर सकें Verify
। हालांकि, एक अच्छे अभ्यास के रूप में, मैं हमेशा इसे सेट करता हूं क्योंकि हमें पैरामीटर को विधि से लागू करने की आवश्यकता हो सकती है या विधि से वापसी मूल्य मिल सकता है।
Times.Exactly(1)
और यह विफल नहीं हुआ जब विधि वास्तव में दो बार बुलाया गया था। Setup
प्रश्न में विधि के लिए जोड़ने के बाद ही यह सही ढंग से विफल हो गया।
परीक्षण नियंत्रक हो सकता है:
public HttpResponseMessage DeleteCars(HttpRequestMessage request, int id)
{
Car item = _service.Get(id);
if (item == null)
{
return request.CreateResponse(HttpStatusCode.NotFound);
}
_service.Remove(id);
return request.CreateResponse(HttpStatusCode.OK);
}
और जब DeleteCars विधि को वैध आईडी के साथ बुलाया जाता है, तो हम यह सत्यापित कर सकते हैं कि, इस परीक्षण द्वारा सेवा निकालने की विधि को एक बार कहा जाता है:
[TestMethod]
public void Delete_WhenInvokedWithValidId_ShouldBeCalledRevomeOnce()
{
//arange
const int carid = 10;
var car = new Car() { Id = carid, Year = 2001, Model = "TTT", Make = "CAR 1", Price=2000 };
mockCarService.Setup(x => x.Get(It.IsAny<int>())).Returns(car);
var httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.Properties[HttpPropertyKeys.HttpConfigurationKey] = new HttpConfiguration();
//act
var result = carController.DeleteCar(httpRequestMessage, vechileId);
//assert
mockCarService.Verify(x => x.Remove(carid), Times.Exactly(1));
}