2010-09-01 14 views
7

मैं http://blogs.msdn.com/b/adonet/archive/2009/12/17/walkthrough-test-driven-development-with-the-entity-framework-4-0.aspxपीओसीओ और टी 4 टेम्पलेट्स के साथ ईएफ 4.0 का परीक्षण - नकली संदर्भ कैसे?

को accodring नकली संदर्भ बनाने के लिए मैं देख सकते हैं एक अंतरफलक जो तरीकों जो रिटर्न IObjectSet < ...> को उजागर करता है कोशिश कर रहा हूँ, लेकिन टी -4 टेम्पलेट्स तरीकों जो रिटर्न ObjectSet < ...> उत्पन्न करता है और कोई उत्पन्न इंटरफेस है और उस पृष्ठ लेखक पर बनाया संदर्भ के लिए इंटरफ़ेस कहते हैं और यह उसे बनाने के लिए रास्ता देती है नकली आदि

मेरा मुख्य लक्ष्य टी -4 टेम्पलेट का उपयोग पोको वर्गों उत्पन्न करने के लिए और परीक्षण करने के लिए नकली/नकली संदर्भ बनाने के लिए है मेरे कस्टम भंडार। क्या इसे लिखने या टी 4 टेम्पलेट बदलने के बिना काम करने का कोई तरीका है ?? मैं कैसे संदर्भ ऊपर mocks बना सकते हैं (IObjectSet तुच्छ is't के लिए) अगर यह अग्रिम

उत्तर

3

में ObjectSet के IObjectSets के बजाय ...

Thx लौटा रहा है लेखक सिर्फ भंडार, नहीं संस्थाओं मजाक कर रहा है। EntityFramework ObjectQueries उत्पन्न करता है, लेकिन वह उन्हें लपेटता है और उसके भंडार IObjectQueries देता है। वह ऐसा करता है ताकि वह डेटा को आसानी से नकल कर सके, फिर सहेजने के दौरान वह केवल संस्थाओं को मान्य करता है।

तुम सिर्फ एक "नकली" भंडार आप अपने खुद के टी -4 टेम्पलेट बना सकते हैं और edmx फ़ाइल से अधिक पुनरावृति और कोड उत्पन्न कर सकते हैं बनाने के लिए कोशिश कर रहे हैं। लेकिन पीओसीओएस उत्पन्न करने का कोई कारण नहीं है? वे पहले से मौजूद हैं, आपको उन्हें फिर से बनाने की आवश्यकता क्यों है? उन्होंने कहा कि एक "सामान्य" FakeObjectSet में सब कुछ निकाला तो वहाँ वास्तव में इतना कोड लिखने के लिए नहीं है?

आप इस उत्पन्न करने के लिए कोशिश कर रहे हैं:

public IObjectSet<Blog> Blogs 
    { 
     get 
     { 
      return _blogs ?? (_blogs = new FakeObjectSet<Blog>()); 
     } 
     set 
     { 
      _blogs = value as FakeObjectSet<Blog>; 
     } 
    } 
    private FakeObjectSet<Blog> _blogs; 

मुझे लगता है कि करने के लिए आप टी -4 के साथ अधिक समय बिताना तो आप बस इसे लिखने होगा जा रहे हैं जा रहा हूँ अगर ऐसा है।

public IObjectSet<Blogs>{ 
    get{ 
    return _Blogs?? (_Blogs = FakeObjectSet<Blog>("Blogs")); 
    } 
    set{ 
    _Blogs= value as FakeObjectSet<Class>("Blogs"); 
    } 
} 

private FakeObjectSet<Blog> _Blogs; 

साइड नोट:


उदाहरण टी -4 वर्ग घोषणा के बिना ... आप this blog

<# 
    foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>()) 
    { 
#> 
public IObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> 
{ 
    get{ 
     return <#=code.FieldName(set)#> ?? (<#=code.FieldName(set)#> = FakeObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>>("<#=set.Name#>")); 
    } 
    set{ 
    <#=code.FieldName(set)#> = value as FakeObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>>("<#=set.Name#>"); 
    } 
} 
private FakeObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> <#=code.FieldName(set)#>; 
<# 
} 

#> 

कौन इस कोड उत्पन्न होगा पालन करके पूरा t4 कर सकते हैं ।

IObjectSet System.Data में निहित है तो कोई संदर्भ जोड़ें रॉय Osherove द्वारा The Art Of Unit Testing में System.Data.Entity.dll को

+0

Mayby मैं गया था याद आती है समझ में आया, मैं तो बस इस लेख पर आधारित कर रहा हूँ। मुझे पता है कि लेखक Pocos वर्ग हैं, लेकिन मैं है बड़े, पहले से ही विद्यमान डीबी, मैं कई difficoulties के बाद इस डीबी से edmx और अगले (इस Oracle DB है), मैं टी -4 टेम्पलेट का उपयोग करने के लिए POCO वर्गों उत्पन्न करने में सक्षम था, क्योंकि बनाने के लिए किया था मैंने उन्हें हाथ से पहले नहीं लिखा था। अब मैं यूनिट टेस्ट जोड़ना चाहता हूं और अगर मैं रिपोजिटरी का परीक्षण करना चाहता हूं तो मुझे अपने संदर्भ ऑब्जेक्ट को मॉक करना होगा। तो टी -4 संस्थाओं और संदर्भ के लिए वर्ग के लिए POCO वर्गों उत्पन्न, लेकिन इस संदर्भ तो मैं इस इंटरफेस के आधार पर नकली नहीं बना सकते के लिए याद आ रही इंटरफेस था। – Simon

+1

धन्यवाद http://slappyza.wordpress.com/2010/08/08/getting-the-entity-framework-to-generate-an-interface-for-mocking/ को मैं अब के लिए समस्या हल हो गए हैं .. :) – Simon

+0

+1। वास्तव में, सब होने की जरूरत है कि 'मैं' घ अपने मौजूदा 'ObjectSet ...' घोषणाओं ... –

1

उद्धरण:

कोई वस्तु उन्मुख समस्या यह है कि नहीं किया जा सकता है को छोड़कर, ज़ाहिर है, अविवेक की बहुत सारी परतें, अविवेक की एक परत जोड़कर हल किया।

नीचे मेरी mockable EF4 POCO सेटअप है। मैं टी -4 का उपयोग नहीं किया क्योंकि यह बहुत बाहर काम करने के लिए कैसे टेम्पलेट को साफ करने के लिए बहुत अधिक gumpf उत्पन्न नहीं करना कठिन था। आप निश्चित रूप से इस संरचना की तरह कुछ थूक से बाहर करने के लिए टी -4 टेम्पलेट हैक कर सकते हैं।

चाल ObjectSet<T> एस मैन्युअल रूप से बनाने और उन्हें IQueryable के रूप में बेनकाब करने के लिए थी।क्योंकि Add और CreateObjectSet<T>/ObjectSet<T> पर कर रहे हैं, मैं भी जोड़ने और संस्थाओं बनाने के लिए तरीके को जोड़ने के लिए किया था।

public interface IStackTagzContext { 
    IQueryable<Question> Questions { get; } 

    Question CreateQuestion(); 

    void CreateQuestion(Question question); 

    void SaveChanges(); 
} 

public class StackTagzContext : ObjectContext, IStackTagzContext { 
    public StackTagzContext() : base("name=myEntities", "myEntities") 
    { 
     base.ContextOptions.LazyLoadingEnabled = true; 
     m_Questions = CreateObjectSet<Question>(); 
    } 

    #region IStackTagzContext Members 
    private ObjectSet<Question> m_Questions; 
    public IQueryable<Question> Questions { 
     get { return m_Questions; } 
    } 


    public Question CreateQuestion() { 
     return m_Questions.CreateObject(); 
    } 
    public void AddQuestion(Question question) { 
     m_Questions.AddeObject(question); 
    } 

    public new void SaveChanges() { 
     base.SaveChanges(); 
    } 

    #endregion 
} 

अब, आप देखेंगे कि इंटरफेस पर इकाई संग्रह प्रकार IQueryable<T> है, के रूप में IObjectSet<T> करने का विरोध किया। मैं FakeObjectSet बनाने परेशान नहीं किया जा सकता है और IQueryable मुझे पर्याप्त लचीलेपन के साथ प्रदान की है। तो केआईएसएस के लिए, मैंने इसके बिना प्रबंधित किया है।

IQueryable मजाक, दूसरे हाथ पर, तुच्छ है:

using Moq; 
[TestClass] 
public class TestClass { 

    Mock<IStackTagzContext> m_EntitiesMock = new Mock<IStackTagzContext>(); 


    [TestMethod()] 
    public void GetShouldFilterBySite() { 
     QuestionsRepository target = new QuestionsRepository(m_EntitiesMock.Object); 

     m_EntitiesMock.Setup(e=>e.Questions).Returns(new [] { 
     new Question{Site = "site1", QuestionId = 1, Date = new DateTime(2010, 06,23)}, 
     }.AsQueryable()); 
    } 
} 
संबंधित मुद्दे