2010-07-13 12 views
6

के लिए इंटरफ़ेस बनाना ObjectContext के लिए एक सारणी परत बनाने की कोशिश कर रहा हूं। मैं समझता हूं कि ओसी कार्य का एक इकाई है, लेकिन मैं पूरी तरह से इसके लिए एक अच्छा इंटरफ़ेस कैसे लिखना नहीं चाहता हूं। आदर्श रूप से मैं अपने 'RealDataContext' को स्वैप करने में सक्षम होना चाहता हूं जो 'FakeDataContext' जैसी कुछ चीज़ों के लिए IDataContext लागू करता है जो पूरी तरह से स्मृति में होगा।ऑब्जेक्ट कॉन्टेक्स्ट

इसका कारण यह है कि मैं इन-मेमोरी डेटाबेस के खिलाफ अपने भंडारों का परीक्षण करने में सक्षम होना चाहता हूं।

धन्यवाद!

उत्तर

7

आप ऑब्जेक्ट कॉन्टेक्स्ट से प्राप्त एक विस्तारित कक्षा बनाने में सक्षम होना चाहिए, और IDataContext इंटरफ़ेस लागू करता है। ऑब्जेक्ट कॉन्टेक्स्ट को वास्तव में नकल करने में सक्षम होने के लिए, आपके IDataContext इंटरफ़ेस को ऑब्जेक्ट कॉन्टेक्स्ट के किसी भी सदस्य के लिए मिलान हस्ताक्षर (या गुण) शामिल करने की आवश्यकता होगी जिसका आप उपयोग कर रहे हैं और नकल करना चाहते हैं। निम्नलिखित की तरह कुछ पर्याप्त होना चाहिए:

interface IDataContext, IDisposable 
{ 
    void AddObject(string entitySetName, object entity); 
    void Attach(IEntityWithKey entity); 
    void Detach(object entity); 
    void DeleteObject(object entity); 
    int SaveChanges(); 
    int SaveChanges(bool acceptChangesDuringSave); 
    int SaveChanges(SaveOptions options); 

    // Any other members you wish to be mockable 
} 

class DataContext: ObjectContext, IDataContext 
{ 
    // nothing here 
} 

तकनीकी रूप से, जब से DataContext सब कुछ ObjectContect से, IDataContext के कार्यान्वयन ObjectContext द्वारा ध्यान रखा जाता है इनहेरिट करती है। आपको DataContext क्लास में किसी भी अतिरिक्त कार्यान्वयन की आवश्यकता नहीं है।

class SomeEntityRepository: IRepository<SomeEntity> 
{ 
    public SomeEntityRepository(IDataContext context) 
    { 
     m_context = context; 
    } 

    private readonly IDataContext m_context; 

    public SomeEntity GetById(long id) 
    { 
     // implementation 
    } 
} 

// xUnit.NET & Moq 
class SomeEntityRepositoryTests 
{ 
    [Fact] 
    public void GetById_returns_entity_when_valid_id_is_passed() 
    { 
     // state and context 
     var mockContext = new Mock<IDataContext>(); 

     // arrangement 
     mockContext.Setup(/* configure mock context here */); 
     var repo = new SomeEntityRepository(mockContext.Object); 

     // activity 
     var entity = repo.GetById(100); 

     // assertions 
    } 
} 
+0

इस दिशा मैं की ओर झुकाव रहा था, लेकिन वास्तव में नहीं था: जब तक आप हमेशा इंजेक्षन (या बनाने के लिए एक कारखाने का उपयोग) के बजाय ObjectContext से IDataContext के उदाहरण के लिए, आप IDataContext नकली करने में सक्षम जब परीक्षण किया जाना चाहिए सुनिश्चित करें कि यह एक अच्छा दृष्टिकोण है। धन्यवाद! – TheCloudlessSky

+0

सेवा के होने के लिए खुशी। :) – jrista

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