2012-03-28 14 views
5

के लिए डेटाबेस कैसे बीज करें मेरा प्रश्न और कोड Code First Entity Framework Unit Test Examples ब्लॉग पोस्ट पर आधारित है। मैं एसक्यूएल कॉम्पैक्ट 4.0 का उपयोग कर रहा हूं और इस तरह के मेरे यूनिट परीक्षण वास्तविक डेटा का उपयोग करके वास्तविक डेटा का उपयोग कर ब्लॉग पोस्ट में वर्णित किए जा रहे वास्तविक डेटा का उपयोग कर रहे हैं।इकाई फ्रेमवर्क कोड पहला: यूनिट परीक्षण

मैं अपने उत्पादन डेटाबेस को कुछ तालिकाओं में डिफ़ॉल्ट मानों के साथ बीज करना चाहता हूं लेकिन मेरे यूनिट परीक्षण चलाते समय मैं अतिरिक्त डेटा जोड़ना चाहता हूं और कुछ डिफ़ॉल्ट मानों को अपडेट करना चाहता हूं।

मैंने एक कस्टम प्रारंभकर्ता वर्ग बनाया है जो डिफ़ॉल्ट मानों वाले डेटाबेस को बीज करता है।

public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> 
{ 
    protected override void Seed(NerdDinners context) 
    { 
     var dinners = new List<Dinner> 
          { 
           new Dinner() 
            { 
             Title = "Dinner with the Queen", 
             Address = "Buckingham Palace", 
             EventDate = DateTime.Now, 
             HostedBy = "Liz and Phil", 
             Country = "England" 
            } 
          }; 

     dinners.ForEach(d => context.Dinners.Add(d)); 

     context.SaveChanges(); 
    } 
} 

public class NerdDinnersInitializerForTesting : NerdDinnersInitializer 
{ 
    protected override void Seed(NerdDinners context) 
    { 
     base.Seed(context); 

     var dinner = context.Dinners.Where(d => d.Country == "England").Single(); 
     dinner.Country = "Ireland"; 

     context.SaveChanges(); 
    } 
} 

मैं अपने इकाई परीक्षण के लिए एक आधार वर्ग का उपयोग इस तरह परीक्षण डेटाबेस initializes: मेरे इकाई परीक्षण के लिए मुझे लगता है कि पहले एक है कि परीक्षण विशिष्ट बोने और/या संशोधन करता है से विरासत एक और कस्टम प्रारंभकर्ता बनाया है इसलिए:

[TestClass] 
public class UnitTest1 : TestBase 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var dinner = new Dinner() 
          { 
           Title = "Dinner with Sam", 
           Address = "Home", 
           EventDate = DateTime.Now, 
           HostedBy = "The wife", 
           Country = "Italy" 
          }; 

     DataContext.Dinners.Add(dinner); 
     DataContext.SaveChanges(); 

     var savedDinner = (from d in DataContext.Dinners 
          where d.DinnerId == dinner.DinnerId 
          select d).Single(); 

     Assert.AreEqual(dinner.Address, savedDinner.Address); 
    } 
} 

मैं परीक्षण LINQ क्वेरी कि savedDinner को हासिल करेगा चलाते हैं के साथ विफल:

[TestClass] 
public abstract class TestBase 
{ 
    protected const string DbFile = "test.sdf"; 
    protected const string Password = "1234567890"; 
    protected NerdDinners DataContext; 

    [TestInitialize] 
    public void InitTest() 
    { 
     Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0", "", 
       string.Format("Data Source=\"{0}\";Password={1}", DbFile, Password)); 
     Database.SetInitializer(new NerdDinnersInitializerForTesting()); 

     DataContext = new NerdDinners(); 
     DataContext.Database.Initialize(true); 
    } 

    [TestCleanup] 
    public void CleanupTest() 
    { 
     DataContext.Dispose(); 

     if (File.Exists(DbFile)) 
     { 
      File.Delete(DbFile); 
     } 
    } 
} 

वास्तविक इकाई परीक्षण इस तरह दिखता है "ऑब्जेक्ट कॉन्टेक्स्ट उदाहरण का निपटारा किया गया है और अब उन परिचालनों के लिए उपयोग नहीं किया जा सकता है जिनके लिए कनेक्शन की आवश्यकता होती है।" अपवाद। मैं क्यों काम नहीं कर सकता।

क्या मैं यहां एक स्वीकार्य पैटर्न कर रहा हूं और क्या कोई इस बारे में कुछ प्रकाश डाल सकता है कि यह क्यों काम नहीं कर रहा है?

धन्यवाद।

+0

मैं ऑब्जेक्ट संदर्भ का निपटान करने का कोई कारण नहीं देख सकता। क्या आप अपने यूनिट टेस्ट को डीबग कर सकते हैं और savechanges विधि में ब्रेक पॉइंट डाल सकते हैं और जांच सकते हैं कि डेटाकॉन्टेक्स्ट शून्य नहीं है या नहीं? तो कृपया अगली पंक्ति पर सेट करें और जांचें कि डेटाकॉन्टेक्स्ट शून्य है या नहीं। – daryal

+0

हाय दाराल, डेटाकॉन्टेक्स्ट किसी भी मामले में शून्य नहीं है। DataContext.SaveChanges(); ठीक काम करता है, यह लिंकक क्वेरी है जिसके बाद विफल रहता है हालांकि डेटाकॉन्टेक्स्ट शून्य नहीं है। –

+0

मैं डेटाकॉन्टेक्स्ट पर किसी भी समस्या के साथ पूछताछ कर सकता हूं। नोट, मुझे मिली त्रुटि में कहा गया है कि ऑब्जेक्ट कॉन्टेक्स्ट का निपटारा किया गया है, डेटाकॉन्टेक्स्ट नहीं। मुझे नहीं पता कि ऑब्जेक्ट कॉन्टेक्स्ट लिंक क्वेरी में डेटाकॉन्टेक्स्ट जैसा ही है। वैसे भी, निम्नलिखित कर रहे हैं: var initDb = नया SvDataContext(); initDb.Database.Initialize (सही); DataContext = नया SvDataContext(); मेरी InitTest विधि में समस्या को हल करता है। –

उत्तर

3

मैं आज सुबह इसी तरह के एक मुद्दे में भाग गया। समस्या बीज विधि में जहां खंड के कारण होता है। (अब के लिए) इस का संभावित हल यह पुनर्लेखन है:

var dinner = context.Dinners.ToList().Where(d => d.Country == "England").Single(); 

हालांकि कुशल नहीं (सभी वस्तुओं डेटाबेस से लिया जाता है और छानने स्मृति में किया जाएगा), यह मेरी इकाई परीक्षण में ObjectDisposedException का समाधान किया। मेरे मामले में मेरे पास केवल कुछ वस्तुएं हैं, इसलिए मैं इसके साथ अभी भी रह सकता हूं।

+0

आपके उत्तर जोस के लिए धन्यवाद। आपने समस्या को अलग कैसे किया? –

+1

मुझे पता लगाने में काफी समय लगा क्योंकि मैं सोच रहा था कि समस्या आईओसी कॉन्फ़िगरेशन के कारण हुई थी, क्योंकि डिसोस्ड अपवाद। मुझे बेहतर जाना चाहिए था, मैंने वहां कुछ भी नहीं बदला और यह पहले काम कर रहा था। मेरे पास एक कामकाजी परिदृश्य था, अतिरिक्त मॉडल के साथ बीज कोड को संशोधित किया गया था (जहां क्लॉज भी पेश किया गया था), जब तक समस्या उत्पन्न नहीं हुई तब तक नए परिचय कोड पर टिप्पणी करने पर रखा गया। जहां खंड कोड और अपवाद वापस आ गया था वहां असुविधा। बंद स्रोत ढांचे के मामले में सरल लेकिन प्रभावी त्रुटि ट्रेसिंग आपको नीचे जाने देती है। –

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