2011-06-14 18 views
12

इकाई परीक्षण के लिए नया। मेरे पास काम की एक इकाई है जिसे मैं यूनिट टेस्ट करने की कोशिश कर रहा हूं। मैं शायद यहां कुछ आसान याद कर रहा हूँ। मैं कमिट विधि का परीक्षण करने की कोशिश कर रहा हूं। मैं नुनिट और moq का उपयोग कर रहा हूँ।यूनिट परीक्षण की इकाई की एक इकाई परीक्षण

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly DbContext _context; 
    public UnitOfWork(DbContext ctx) 
    { 
     _context = ctx; 
    } 

    public void Commit() 
    { 
     _context.SaveChanges(); 
    } 
} 

इसका परीक्षण करने के लिए मुझे क्या करने की आवश्यकता है?

उत्तर

16

आप डीबीसीएन्टेक्स्ट का एक मॉक डालेंगे और फिर सत्यापित करेंगे कि SaveChanges विधि को प्रतिबद्धता पर बुलाया जाता है।

[Test] 
public void Will_call_save_changes() { 

    var mockContext = new Mock<DBContext>(); 
    var unitOfWork = new UnitOfWork(mockContext.Object); 

    unitOfWork.Commit(); 


    mockContext.Verify(x => x.SaveChanges()); 

} 
1

आपको डीबीकॉन्टेक्स्ट का नकल करने की आवश्यकता होगी, और तब सत्यापित करें कि SaveChanges को कॉल किया गया था। मोक की तरह कुछ आपको यहां मदद कर सकता है।

0

यह करने का एक तरीका है।

एक वैकल्पिक मैं का सामना करना पड़ा है:

अपने edmx फ़ाइल बनाएं, तो यह संस्थाओं autogenerate नहीं करता कस्टम उपकरण को हटा दें।

edmx फ़ाइल खोलें, राइट क्लिक करें और कोड जनरेशन आइटम जोड़ें - डेटाबेस के अंतर्गत ऑनलाइन टेम्पलेट्स पर जाएं और ईएफ पॉको मॉकोबजेक्ट जनरेटर का चयन करें। यह दो टी 4 टेम्पलेट्स बनाता है (एक इकाई के लिए और दूसरा ऑब्जेक्ट संदर्भ और नकली ऑब्जेक्ट संदर्भ के लिए)।

एक टी 4 टेम्पलेट आपके लिए आपके पॉको इकाइयों को उत्पन्न करेगा। अन्य टी 4 टेम्पलेट एक इंटरफ़ेस तैयार करेगा जिसे आप काम की इकाई के रूप में उपयोग करने के लिए बढ़ा सकते हैं जिसे वास्तविक ऑब्जेक्ट संदर्भ और नकली ऑब्जेक्ट संदर्भ में लागू किया गया है। इसे विस्तारित करने के लिए आपको जेनरेट इंटरफ़ेस (शून्य SaveChanges()) पर एक अतिरिक्त विधि शामिल करने और नकली ऑब्जेक्ट संदर्भ पर उस विधि के कार्यान्वयन के लिए T4 टेम्पलेट को संशोधित करने की आवश्यकता है।

मुझे यह बहुत अच्छी तरह से काम करने के लिए मिला है।

यूनिट परीक्षण उद्देश्यों के लिए यद्यपि, आप काम की अपनी इकाई का परीक्षण नहीं करना चाहेंगे (जब तक कुछ वस्तुओं को सत्यापित/हटाया नहीं जाता है)। इसके बजाय आप पूर्वनिर्धारित जिम्मेदारियों के साथ भंडारों का परीक्षण करेंगे - आमतौर पर संदर्भ (पूर्व रोगी नियुक्तियों) के भीतर परिभाषित किया जाता है। यह appropiately की संरचना करने के

public class PatientAppointmentRepository : IPatientAppointmentRepository 
{ 
    //Injected via IOC in constructor 
    private readonly IUnitOfWork _unitOfWork; 
    private readonly IPatientAppointmentLogic _patientAppointmentLogic; 
    public void CreateAppointment(PatientAppointmentModel model) 
    { 
     var appointment = ModelMapper.Instance.To<PatientAppointment>(model); 

     var appointmentAdded = _patientAppointmentLogic.Add(appointment); 

     if(appointmentAdded) 
      _unitOfWork.SaveChanges(); 
    } 
} 

public class PatientAppointmentLogic : IPatientAppointmentLogic 
{ 
    private readonly IUnitOfWork _unitOfWork; //Set via constructor 
    private readonly PatientLogic _patientLogic; 
    public bool Validate(PatientAppointment appointment) 
    { 
     if(appointment == null) 
      throw new ArgumentNullException("appointment"); 

     //perform some logic here 
     return true; 
    } 
    public void Add(PatientAppointment appointment) 
    { 
     if(appointment == null) 
      throw new ArgumentNullException("appointment"); 

     if(!Validate(appointment)) return; //Or throw an exception, up to you 

     var patient = _patientLogic.GetById(appointment.PatientId); 

     if(patient == null) return; 

     patient.PatientAppointments.Add(appointment); 
    } 
} 

यह वास्तव में अपने से ऊपर:

आप कुछ इस तरह करते हैं चाहते हैं। आपके पास एक और नियुक्ति लॉजिक रिपोजिटरी हो सकती है जिसमें एक उदाहरण के रूप में आधार सत्यापन है।

आदर्श रूप से, सामान्य सत्यापन बाहरी संसाधनों (जैसे डेटाबेस) पर निर्भर नहीं होना चाहिए।

आपको एक झुकाव में एक सत्यापन संदर्भ बनाने में सक्षम होना चाहिए जिसका उपयोग आगे सत्यापन में किया जाएगा (पहले 'बड़े पैमाने पर' मान्य करने से पहले 'सस्ता' वैध होगा)।

कभी-कभी सत्यापन के लिए आपको आवश्यक सभी 'मान' एक ऐसी इकाई के अंदर है जिसे आपको वैसे भी चाहिए, फिर उसे सत्यापन संदर्भ के रूप में उपयोग करें।

शुभकामनाएँ!

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