57

में इकाई परीक्षण के लिए LocalDb स्थापित करने के लिए हम का उपयोग कर इकाई की रूपरेखा 5.कैसे दृश्य स्टूडियो 2012 और इकाई की रूपरेखा 5

कुछ इकाई परीक्षण है कि एक डेटाबेस पर निर्भर कर रहे हैं एक Visual Studio 2012 ASP.NET MVC परियोजना है। एक केंद्रीय SQL सर्वर डेटाबेस का उपयोग करने के लिए परीक्षण प्रोजेक्ट में app.config फ़ाइल सेट अप ठीक काम करता है।

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

हालांकि, मुझे काम करने के लिए सेटअप नहीं मिल रहा है। अगर मैं app.config में इस प्रयास करें:

<add name="TestDb" 
    connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=unittestdb; 
    Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\unittestdb.mdf" 
    providerName="System.Data.SqlClient" /> 

मैं:

System.Data.SqlClient.SqlException: एक फ़ाइल सक्रियण त्रुटि उत्पन्न हुई। भौतिक फ़ाइल नाम '\ unittestdb.mdf' गलत हो सकता है। का निदान करें और अतिरिक्त त्रुटियों को सही करें, और ऑपरेशन को पुनः प्रयास करें। बनाएं डाटाबेस विफल। सूचीबद्ध कुछ फ़ाइल नाम नहीं बनाया जा सका। संबंधित त्रुटियों की जांच करें।

ऐसा लगता है कि यह एमडीएफ फ़ाइल पहले से मौजूद होना चाहता है, जो डेटाबेस बनाने की कोशिश कर रहा है क्योंकि यह अजीब लगता है। एक एमडीएफ फ़ाइल मैन्युअल रूप से बनाना त्रुटि संदेश नहीं बदलता है।

+1

आप इकाई परीक्षण जब में जांच कर सकता है कि तुम क्या मूल्य की क्या ज़रूरत है आप कॉल करते हैं: 'AppDomain.CurrentDomain.GetData ("DataDirectory") '? –

+0

इकाई परीक्षण में 'AppDomain.CurrentDomain.GetData (" DataDirectory ") का मान' शून्य 'है। –

+1

तो या तो कनेक्शन सेट में 'SetData' का उपयोग करके कुछ पथ पर मान सेट करें या कनेक्शन स्ट्रिंग में' | DataDirectory | 'का उपयोग न करें क्योंकि यह' शून्य 'है। –

उत्तर

32

प्रयास करें: बजाय

// Declare this property - this is set by MSTest 
public TestContext TestContext { get; set; } 

// In test initialization - note the signature should be exactly this 
// A static void method with one argument of type TestContext 
[ClassInitialize] 
public static void SetUp(TestContext context) 
{ 
    AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(context.TestDeploymentDir, string.Empty)); 
} 

आप AppDomain.CurrentDomain.BaseDirectory प्रयोग करने में समस्या हो सकता है,:

AppDomain.CurrentDomain.SetData(
    "DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "")); 

यह /bin/Debug/yourdbname.mdf

पर Db फ़ाइल बनाएं जाएगा
9

मैं का प्रयोग करेंगे उपयोग करें: context.TestDeploymentDir

+1

'संदर्भ' किस प्रकार का है और यह कहां से आता है? –

+3

इस तरह की एक संपत्ति अपनी टेस्ट क्लास में जोड़ें और एमएसटीएस्ट आपके लिए 'सार्वजनिक टेस्ट कॉन्टेक्स्ट टेस्टकॉन्टेक्स्ट {प्राप्त करें; सेट; } ' – Jupaol

+0

क्या आप समझा सकते हैं कि सेटअप विधि में ऐसा क्यों करना मेरे नए माइग्रेशन से पहले बेहतर है। कॉन्फ़िगरेशन();'? – bbodenmiller

3

ध्यान रखें कि एक परीक्षण पीआर के लिए oject:

 
AttachDBFilename=|DataDirectory| 

का मतलब है के रूप में अपने वेब/उत्पादन/जो कुछ भी अनुप्रयोग में App_Data फ़ोल्डर का विरोध करने के लिए यह एक इकाई परीक्षण के लिए अपने उत्पादन/bin/डिबग फ़ोल्डर में दिखेगा।

आपको दो चीजें करने की आवश्यकता है 1. डेटाबेस फ़ाइल को अपने ऐप_Data फ़ोल्डर से अपने परीक्षण ऐप की रूट पर ले जाएं। 2. अपने डेटाबेस को हाइलाइट करें ताकि आपको विजुअल स्टूडियो में अपनी प्रॉपर्टी विंडो मिल सके। बिल्ड एक्शन को "कंटेंट" पर सेट करें ताकि जब आप प्रोजेक्ट चलाते हैं तो यह आपके आउटपुट फ़ोल्डर में कॉपी हो जाएगा।

वोला।

[ClassInitialize] 
public static void SetUp(TestContext context) 
{ 
    AppDomain.CurrentDomain.SetData(
     "DataDirectory", 
     context.TestDeploymentDir); 
} 

आमतौर पर यह आपके समाधान के TestResults\<test run>\Out\ फ़ोल्डर के अंदर अपने डेटाबेस का निर्माण करेगा:

1

मैं इस कोड (Jupaol के उत्तर के आधार पर) का उपयोग करने का सुझाव देते हैं।

+0

हाय, वीएस 2013 का उपयोग करना यह कोड काम करता है जब मैं "डीबग टेस्ट" मोड में अपना यूनिट परीक्षण चलाता हूं। लेकिन जब मैं "रन रन" परीक्षण चलाता हूं तो यह विफल रहता है। मैं इसे "सभी चलाएं" मोड – Martin

0

समस्या के उत्तर की खोज करते समय मुझे आपका प्रश्न मिला। एक अलग परियोजना में NUnit साथ EntityFramework का उपयोग करना, मैं App.config

बदलना पड़ा इस तरह देखा:

<?xml version="1.0" encoding="utf-8"?> 
 
<configuration> 
 
    <configSections> 
 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
 
    </configSections> 
 
    <entityFramework> 
 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
 
     <parameters> 
 
     <parameter value="v11.0" /> 
 
     </parameters> 
 
    </defaultConnectionFactory> 
 
    <providers> 
 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
 
    </providers> 
 
    </entityFramework> 
 
</configuration>

+0

में कैसे काम कर सकता हूं और यह डेटासोर्स विशेषता का उपयोग कर यूनिटटेस्ट के लिए काम करता है? –