2014-04-12 12 views
8

मैंइकाई परीक्षण में विफल रहता है

  • http://effort.codeplex.com/ और
  • एसक्यूएल सीई सर्वर (स्थानीय डीबी फ़ाइल)

http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort के साथ संयोजन में EF6 का उपयोग कर इकाई परीक्षण का मूल्यांकन कर रहा हूँ एक बहुत अच्छा संदर्भ था लेकिन अब मैं अटक गया हूँ।

मेरे पास 2 टेस्ट प्रोजेक्ट हैं (एक प्रयास के लिए और दूसरा एसक्यूएल सीई के लिए)। अगर मैं अलग-अलग दोनों को ठीक से चला रहा हूं। ReSharper परीक्षण धावक के साथ एक पंक्ति में दोनों चल रहा है अंतिम परीक्षण परियोजना हमेशा विफल रहता है। या तो

System.InvalidOperationException: इकाई की रूपरेखा पहले से ही एक DbConfiguration उदाहरण का उपयोग करते हुए एक प्रयास करने से पहले एक 'लोड' ईवेंट हैंडलर जोड़ने के लिए बनाया गया था। एंटीटी फ्रेमवर्क का उपयोग करने से पहले 'लोडेड' ईवेंट हैंडलर को केवल एप्लिकेशन के हिस्से के रूप में जोड़ा जा सकता है।

या

System.InvalidOperationException: डिफ़ॉल्ट DbConfiguration उदाहरण 'SqlCeConfiguration'.The' SqlCeConfiguration 'उदाहरण के उदाहरण स्थापित करने के लिए इकाई की रूपरेखा द्वारा इस्तेमाल किया गया था से पहले एक प्रयास किया गया था चाहिए किसी भी इकाई फ्रेमवर्क सुविधाओं का उपयोग करने से पहले एप्लिकेशन प्रारंभ पर सेट किया जाना चाहिए या एप्लिकेशन की कॉन्फ़िगरेशन फ़ाइल में पंजीकृत होना चाहिए।

यह हमेशा वही रहता है। उत्तराधिकारी पूर्ववर्ती से डीबी कॉन्फ़िगरेशन उदाहरण प्राप्त करता है। मैं साइड इफेक्ट्स के बिना टेस्ट प्रोजेक्ट/कॉन्फ़िगरेशन दोनों कैसे चला सकता हूं?

यहाँ मेरी DbContext वर्ग है:

public class DataContext : DbContext 
{ 
    public DataContext(string connectionString) : base(connectionString) 
    { Configuration.LazyLoadingEnabled = false; } 

    public DataContext(DbConnection connection) : base(connection, true) 
    { Configuration.LazyLoadingEnabled = false; } 
} 

है कि प्रयास के साथ परीक्षण स्थिरता:

[TestFixtureSetUp] 
public void TestFixtureSetup() 
{ 
    EffortProviderConfiguration.RegisterProvider(); 
    var connection = DbConnectionFactory.CreateTransient(); 
    var dbContext = new DataContext(connection); 
    ... 
} 

साथ एसक्यूएल सीई परीक्षण स्थिरता है कि:

[TestFixtureSetUp] 
public void TestFixtureSetup() 
{ 
    const string filePath = @"LocalDb.sdf"; 
    var connectionString = string.Format("Data Source={0}; Persist Security Info=False;", filePath); 
    DbConfiguration.SetConfiguration(new SqlCeConfiguration()); 

    var dbContext = new DataContext(connectionString); 
    dbContext.Database.Create(); 
    ... 
} 

और मेरे SqlCeConfiguration:

public class SqlCeConfiguration : DbConfiguration 
{ 
    public SqlCeConfiguration() 
    { 
     SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance); 
     SetDefaultConnectionFactory(new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0")); 
    } 
} 

बहुत बहुत शुक्रिया!

मार्सेल

+0

'डीबी कॉन्फ़िगरेशन.सेट कॉन्फ़िगरेशन() 'विधि आम तौर पर प्रति ऐपडोमेन के एक' डीबी कॉन्फ़िगरेशन 'की अनुमति देती है। क्या आपने इसे कोड में सेट करने की कोशिश करने के बजाए प्रदाता को मैन्युअल रूप से कनेक्शन स्ट्रिंग में डालने का प्रयास किया है? –

+0

@martin_costello संकेत के लिए धन्यवाद। दुर्भाग्यवश प्रदाता एक "समर्थित कीवर्ड नहीं है"। क्या आप एसक्यूएल सीई सर्वर के लिए एक उदाहरण कनेक्शन स्ट्रिंग प्रदान करते हैं? – Marcel

+0

[यह भी देखें] (http://stackoverflow.com/questions/30730224/running-code-on-assembly-load-in-xunit/30730225) – AlexFoxGill

उत्तर

8

जब हमारे निर्माण सर्वर पर सभी UnitTests चल रहे हैं या जब सभी UnitTests स्थानीय स्तर पर चल रहा है हम एक ही त्रुटियों को देख रहे थे।

सिस्टम।अमान्य ऑपरेशन अपवाद: 'लोड' ईवेंट हैंडलर जोड़ने के प्रयास किए जाने से पहले डीबी कॉन्फ़िगरेशन उदाहरण का उपयोग करके एंटीटी फ्रेमवर्क पहले से ही था। एंटीटी फ्रेमवर्क का उपयोग करने से पहले 'लोडेड' ईवेंट हैंडलर को केवल एप्लिकेशन के हिस्से के रूप में जोड़ा जा सकता है।

एक बार जब हम [testInitialize] विधि से विधानसभा प्रारंभिक विधि में प्रयास प्रदाता पंजीकरण कोड ले गए, तो सब कुछ काम करना शुरू कर दिया। रिपोर्ट की गई त्रुटि में संदेश के आधार पर, ऐसा प्रतीत होता है कि पंजीकरण एक से अधिक बार नहीं हो सकता है।

[AssemblyInitialize()] 
    public static void AssemblyInit(TestContext context) 
    { 
     Effort.Provider.EffortProviderConfiguration.RegisterProvider(); 
    } 
0

मैं अभी इस पर आया और सोचा कि मैं अपने मुद्दे का कारण साझा करूंगा।

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

इसलिए किसी ने पहले ही प्रयास के साथ इसे कॉन्फ़िगर करने का प्रयास करने से पहले डेटाकॉन्टेक्स्ट का उपयोग कर लिया था।

आशा है कि यह भविष्य में किसी की मदद कर सकता है, यद्यपि यह एक अलग कारण है, और मुझे उम्मीद है कि आपने अपना मुद्दा अंत में हल कर लिया है!

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