हम हमारी सेवा कक्षाओं की इकाई परीक्षण करने के लिए Moq का उपयोग कर रहे हैं, लेकिन ऐसी स्थितियों का परीक्षण कैसे करें जहां एक सेवा विधि एक ही कक्षा के किसी अन्य सेवा विधि को कॉल करती है। मैंने वर्चुअल को बुलाए जाने वाले तरीके को सेट करने का प्रयास किया, लेकिन फिर भी यह पता नहीं लगा सका कि मोक में क्या करना है। उदाहरण के लिए:उसी कक्षा में वर्चुअल विधियों को ओवरराइड करने के लिए Moq का उपयोग
public class RenewalService : IRenewalService
{
//we've already tested this
public virtual DateTime? GetNextRenewalDate(Guid clientId)
{
DateTime? nextRenewalDate = null;
//...<snip> a ton of already tested stuff...
return nextRenewalDate;
}
//but want to test this without needing to mock all
//the methods called in the GetNextRenewalDate method
public bool IsLastRenewalOfYear(Renewal renewal)
{
DateTime? nextRenewalDate = GetNextRenewalDate(renewal.Client.Id);
if (nextRenewalDate == null)
throw new Exceptions.DataIntegrityException("No scheduled renewal date, cannot determine if last renewal of year");
if (nextRenewalDate.Value.Year != renewal.RenewDate.Year)
return true;
return false;
}
}
उपरोक्त उदाहरण में, हमारे GetNextRenewalDate विधि बहुत जटिल है, और हम पहले से ही इकाई यह परीक्षण किया है। हालांकि, हम GetNextRenewalDate के लिए आवश्यक सब कुछ नकल करने की आवश्यकता के बिना सरल IsLastRenewalOfYear का परीक्षण करना चाहते हैं। असल में, हम सिर्फ GetNextRenewalDate को मॉक करना चाहते हैं।
मुझे एहसास है कि मैं एक नई कक्षा बना सकता हूं जो GetNextRenewalDate को ओवरराइड करता है और नई कक्षा का परीक्षण करता है, लेकिन क्या यह एक तरीका है कि मैं इसे आसान बनाने के लिए मोक का लाभ उठा सकता हूं?
यह काम करता प्रतीत होता है ... मुझे सबकुछ वर्चुअल बनाने की भी आवश्यकता नहीं थी (मैंने इसे ऊपर जैसा ही रखा)। – Andrew
@ एंड्रयू। उपर्युक्त काम करता है क्योंकि 'मॉक.कॉलबेस == सत्य' का अर्थ यह है कि एक अपॉइंटमेंट जो सेटअप द्वारा मेल नहीं खाते हैं, अंतर्निहित कार्यान्वयन को कॉल करेंगे। इसलिए, 'IsLastRenewalOfYear' कार्यान्वयन को कॉल करेगा, क्योंकि यह वर्चुअल नहीं है, लेकिन' GetNextRenewalDate' 'शून्य' वापस कर देगा क्योंकि सेटअप हमेशा मिलान किया जाएगा। निम्न कोड काम करेगा, भले ही 'IsLastRenewalOfYear' ** ** वर्चुअल है। –
हमने इसे कुछ अन्य स्थानों में भी इस्तेमाल किया, एक आकर्षण की तरह काम किया। धन्यवाद! – Andrew