2010-11-26 8 views
11

मैं इन कक्षाओं में है:एक स्थैतिक वर्ग (यूनिटऑफवर्क केस) के साथ स्थिर वर्ग कैसे करें?

public static class UnitOfWorkSS 
{ 
    public static IUnitOfWork Begin() 
    { 
    return IoC.Resolve<IUnitOfWork>(); 
    } 
} 

public class PostService 
{ 
    using (IUnitOfWork unitOfWork = UnitOfWorkSS.Begin()) 
    { 
    //don't forget to sanitize html content 
    htmlContent = _htmlSanitizer.Sanitize(htmlContent); 

    IPost post = _factory.CreatePost(byUser, title, htmlContent);      

    _postRepository.Add(post); 

    unitOfWork.Commit(); 
    } 
} 

मैं वर्गों UnitOfWorkSS और unitOfWork कैसे नकली कर सकते हैं?

उत्तर

9

यह केवल एक चीज आप कॉल के साथ कर रहे हैं शुरू करने के लिए() है कि विशेष इंटरफ़ेस के लिए अपने कॉन्फ़िगर वर्ग लौटा रहा है जैसा दिखता है: IUnitOfWork

आप वास्तव में सिर्फ यह सुनिश्चित करें कि आपकी कॉल शुरू करने के लिए बनाने की जरूरत है() रिटर्न IUnitOfWork

को दो तरीकों से ऐसा कर सकते हैं में से एक का एक नकली कार्यान्वयन:

विकल्प एक - Refactor UnitOfWorkSS आपके कहने सेट कर सकते हैं ताकि

public static class UnitOfWorkSS 
{ 
    private static IUnitOfWork _unitOfWork; 
    public static IUnitOfWork UnitOfWork 
    { 
     set { _unitOfWork = value; } 
     private get{ _unitOfWork ?? (_unitOfWork = IoC.Resolve<IUnitOfWork>()); } 
    } 

    public static IUnitOfWork Begin() 
    { 
     return UnitOfWork; 
    } 
} 

[TestMethod] 
public void DoStuff() 
{ 
    var mockUnitOfWork = new Mock<IUnitOfWork>(); 
    UnitOfWorkSS.UnitOfWork = mockUnitOfWork.Object; 

    //Do some setup and verify 
} 

वापस करने विकल्प दो - बस अपने आईओसी कंटेनर के साथ IUnitOfWork की एक नकली उदाहरण रजिस्टर

private Mock<IUnitOfWork> _mockUnitOfWork; 

[TestInitialize] 
public void Init() 
{ 
    _mockUnitOfWork = new Mock<IUnitOfWork>(); 

    //Making a lot of assumptions about your IoC here... 
    IoC.Register<IUnitOfWork>(_mockUnitOfWork.Object); 
} 

[TestMethod] 
public void DoStuff() 
{ 
    _mockUnitOfWork.Setup(...); 

    //Do some verification 
} 
+0

विकल्प 2 मेरे लिए बेहतर लगता है कि विकल्प 1 राज्य को केवल टेस्टेबल बनाने के लिए एक स्थैतिक वर्ग में पेश करता है - हालांकि शायद यह ओपी सभी की तलाश में है। – aaaaaa

1

जहाँ तक मुझे पता है, आप स्थैतिक कक्षाओं या विधियों का नकल नहीं कर सकते हैं।

+0

हाँ, मुझे एहसास हुआ। लेकिन बात यह है कि मुझे उस कार्यक्षमता को नकली करने की ज़रूरत है, क्या ऐसा करने का कोई तरीका है? – Attilah

+0

जहां तक ​​मुझे पता है, आपको गैर-स्थैतिक होने के लिए कार्य सामग्री की अपनी इकाई को फिर से लिखना होगा। – Chris

2

IUnitOfWork को मॉक करें और इसे अपने कंटेनर में पंजीकृत करें ताकि इसे हल किया जा सके।

0

मुझे पता है यह एक बहुत पुरानी सवाल है, लेकिन इस मामले में किसी को यहाँ समाप्त होता है ...

सबसे अच्छा समाधान अन्य उत्तरों की तरह एक डिजाइन परिवर्तन है। हालांकि, यदि यह संभव नहीं है, तो आप या तो माइक्रोसॉफ्ट फॉक्स (जो मोल्स को प्रतिस्थापित कर सकते हैं) का उपयोग कर सकते हैं या, यदि आप विजुअल स्टूडियो पर निर्भर नहीं हैं, तो स्मोक्स नामक एक लाइब्रेरी है जो मदद कर सकती है।

https://github.com/vanderkleij/Smocks

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