क्या एक इकाई परीक्षण परियोजना लक्ष्य एप्लिकेशन की ऐप लोड कर सकती है ।config फ़ाइल?


150

मैं एक .NET अनुप्रयोग (.exe) का परीक्षण कर रहा हूं जो कॉन्फ़िगरेशन गुणों को लोड करने के लिए एक app.config फ़ाइल का उपयोग करता है। इकाई परीक्षण आवेदन में स्वयं एक app.config फ़ाइल नहीं है।

जब मैं एक ऐसी विधि का परीक्षण करने की कोशिश करता हूं जो किसी भी कॉन्फ़िगरेशन गुण का उपयोग करती है, तो वे अशक्त हो जाते हैं । मैं यह मान रहा हूं क्योंकि यूनिट टेस्ट एप्लिकेशन लक्ष्य एप्लिकेशन के ऐप में लोड नहीं होने जा रहा है ।config।

क्या इसे ओवरराइड करने का कोई तरीका है या क्या मुझे एक स्थानीय app.config के लिए लक्ष्य app.config की सामग्री को कॉपी करने के लिए स्क्रिप्ट लिखना है?

यह पोस्ट इस तरह के सवाल पूछती है, लेकिन लेखक वास्तव में मुझे एक अलग कोण से देख रहा है।

संपादित करें: मुझे उल्लेख करना चाहिए कि मैं अपनी इकाई परीक्षणों के लिए VS08 टीम सिस्टम का उपयोग कर रहा हूं।

जवाबों:


59

ऐसा करने का सबसे सरल तरीका यह है कि आप .configअपने यूनिट टेस्ट में तैनाती सेक्शन में फाइल को जोड़ें ।

ऐसा करने के लिए, .testrunconfigअपने समाधान आइटम से फ़ाइल खोलें । परिनियोजन अनुभाग में, .configअपने प्रोजेक्ट की बिल्ड निर्देशिका (संभवतया bin\Debug) से आउटपुट फ़ाइलें जोड़ें ।

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

संपादित करें: मैं जोड़ना भूल गया, यह सभी स्थितियों में काम नहीं करेगा, इसलिए आपको एक स्टार्टअप स्क्रिप्ट को शामिल करने की आवश्यकता हो सकती है .configजो यूनिट टेस्ट के नाम से मेल खाने के लिए आउटपुट का नाम बदल देती है।


9
यह बहुत आसान है कि परीक्षण प्रोजेक्ट में सिर्फ एक app.config फ़ील्ड जोड़ें - आपको फिर .testrunconfig के साथ खेलने की ज़रूरत नहीं है।
रोलैंड शॉ

13
@ यदि आप ऐसा करते हैं, तो आपको app.config की दो प्रतियां रखनी होंगी। मैं दोनों स्थानों में app.config को अपडेट करने के लिए याद रखने की तुलना में .testrunconfig टूल का उपयोग करते हुए एक बार, 10 सेकंड खर्च करता हूं।
जेरोमे इरविन

66
क्या आप केवल एक गैर-प्रतिलिपि संदर्भ नहीं जोड़ सकते? (मौजूदा आइटम जोड़ें ...)
एफ्रिम

6
EFraim की टिप्पणी को स्वीकृत उत्तर होना चाहिए, यह किसी भी चीज़ की तुलना में बहुत सरल है।
रेगिगुएटर

28
EFraim के सोल के लिए: कमांड बटन से "Add as Link" का उपयोग करना सुनिश्चित करें। अन्यथा आप अभी भी एक प्रति प्राप्त करते हैं। हालांकि, हालांकि प्रश्न विशेष रूप से एक .Net ऐप के लिए है, यह वेब ऐप के लिए काम नहीं करेगा क्योंकि वेब ऐप के कॉन्फिगर में गलत नाम है (Web.Config, App.Config नहीं)
Rob Von

103

विजुअल स्टूडियो 2008 में मैंने app.configफ़ाइल को एक मौजूदा आइटम के रूप में परीक्षण परियोजना में जोड़ा और यह सुनिश्चित करने के लिए लिंक के रूप में चयनित प्रतिलिपि बनाई कि यह डुप्लिकेट नहीं है। इस तरह मेरे पास मेरे हल में केवल एक प्रति है। कई परीक्षण परियोजनाओं के साथ यह वास्तव में काम आता है!

मौजूदा आइटम जोड़ें

लिंक के रूप में जोड़ें


7
बिल्कुल सही जवाब, सरल और उद्देश्य! +1
कॉस्टोडियो

2
यह सबसे अच्छा समाधान है और इसे उत्तर के रूप में चिह्नित किया जाना चाहिए।
निआहेर

4
मौजूदा आइटम को "एक लिंक के रूप में" जोड़ने के लिए: आपको मौजूदा आइटम जोड़ें संवाद बॉक्स में, उस प्रोजेक्ट आइटम का पता लगाएं और उसका चयन करें जिसे आप लिंक करना चाहते हैं ", फिर:" ओपन बटन ड्रॉप-डाउन सूची से, जोड़ें लिंक के रूप में चुनें। "
यूरियाल

यह मेरे लिए बहुत अच्छा काम किया। मैं ऐसी स्थिति के बारे में सोचने की कोशिश कर रहा हूं, जहां यह काम नहीं करेगा ... और मैंने अभी काफी सोचा है। धन्यवाद!
डुडमैन 3000

53

चाहे आप टीम सिस्टम टेस्ट या NUnit का उपयोग कर रहे हों , सबसे अच्छा अभ्यास अपने परीक्षणों के लिए एक अलग क्लास लाइब्रेरी बनाना है। बस अपने परीक्षण परियोजना में एक App.config जोड़ने पर आप संकलन करने के लिए स्वचालित रूप से आपके बिन फ़ोल्डर में कॉपी हो जाएंगे

यदि आपका कोड विशिष्ट कॉन्फ़िगरेशन परीक्षणों पर निर्भर है, तो पहले परीक्षण में मैं लिखूंगा कि कॉन्फ़िगरेशन फ़ाइल उपलब्ध है ( ताकि मुझे पता हो कि मैं पागल नहीं हूं ):

<configuration>
   <appSettings>
       <add key="TestValue" value="true" />
   </appSettings>
</configuration>

और परीक्षण:

[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
     }
}

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

public class MyObject
{
     public void Configure(MyConfigurationObject config)
     {
          _enabled = config.Enabled;
     }

     public string Foo()
     {
         if (_enabled)
         {
             return "foo!";
         }
         return String.Empty;
     }

     private bool _enabled;
}

[TestFixture]
public class MyObjectTestFixture
{
     [Test]
     public void CanInitializeWithProperConfig()
     {
         MyConfigurationObject config = new MyConfigurationObject();
         config.Enabled = true;

         MyObject myObj = new MyObject();
         myObj.Configure(config);

         Assert.AreEqual("foo!", myObj.Foo());
     }
}

2
मैं यहाँ विन्यास निर्भरता में पारित होने की भावना से सहमत हूँ, ऐसा लगता है कि मार्क सेमन ने इसका जवाब नहीं दिया है। यहाँ पर: लापता होने के कारण फेलिंग यूनिट परीक्षण ।config फ़ाइल
शॉन

एक "लाइन से गायब है: स्ट्रिंग मान = configurationManager.AppSettings [" TestValue]; मैंने इसे ठीक करने की कोशिश की, लेकिन मुझे एक संपादन करने की अनुमति देने के लिए स्टैकओवरफ़्लो प्राप्त करने के लिए ठीक करने के लिए एक और 5 वर्णों को खोजना होगा।
जेन

22

यदि आपके पास एक समाधान है जिसमें उदाहरण के लिए वेब एप्लिकेशन और टेस्ट प्रोजेक्ट शामिल हैं, तो आप शायद चाहते हैं कि टेस्ट प्रोजेक्ट वेब एप्लिकेशन के web.config का उपयोग करता है।

इसे हल करने का एक तरीका यह है कि प्रोजेक्ट को परखने के लिए web.config की प्रतिलिपि बनाई जाए और इसे app.config नाम दिया जाए।

एक और बेहतर समाधान बिल्ड चेन को संशोधित करना और प्रोजेक्ट आउटपुट निर्देशिका का परीक्षण करने के लिए web.config की स्वचालित प्रतिलिपि बनाना है। ऐसा करने के लिए, टेस्ट एप्लिकेशन पर राइट क्लिक करें और गुणों का चयन करें। अब आपको प्रोजेक्ट प्रॉपर्टीज देखनी चाहिए। "बिल्ड इवेंट्स" पर क्लिक करें और फिर "पोस्ट-बिल्ड संपादित करें ..." बटन पर क्लिक करें। निम्नलिखित पंक्ति वहां लिखें:

copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"

और ओके पर क्लिक करें। (ध्यान दें कि आपको सबसे पहले WebApplication1 को बदलने की आवश्यकता है क्योंकि आप परियोजना का नाम जिसे आप परीक्षण करना चाहते हैं)। यदि आपके पास web.config के लिए गलत रास्ता है, तो प्रतिलिपि विफल हो जाती है और आप इसे असफल निर्माण के दौरान नोटिस करेंगे।

संपादित करें:

वर्तमान प्रोजेक्ट से टेस्ट प्रोजेक्ट में कॉपी करने के लिए:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"

वास्तव में अच्छा समाधान। इससे मुझे .configफ़ाइलों की प्रतिलिपि बनाने और डुप्लिकेट करने से बचने में सहायता मिली । साझा करने के लिए धन्यवाद! :)
लेनियल मैककैफर्री

बहुत अच्छा समाधान! बहुत बहुत धन्यवाद।
विन शहरदार

अच्छा समाधान, लेकिन क्या होता है जब मुख्य में web.configकेवल .configउसी परियोजना के भीतर बाहरी फ़ाइलों का संदर्भ होता है । चूंकि पथ केवल उसी निर्देशिका के भीतर फ़ोल्डरों को इंगित कर सकता है (जो सामान्य रूप से सत्य है), परीक्षण चलाते समय, यह बाहरी फ़ाइलों को संभालने में सक्षम नहीं होगा। किसी भी विचार यह कैसे हल करने के लिए?
सुगफ्री

इसने मेरे लिए काम किया: "$" (सॉल्यूशनडिर) \ मेनप्रोजेक्ट \ Web.config "" $ (प्रोजेक्टडिर) app.config "
एंड्रयू

8

यह थोड़ा पुराना है लेकिन मुझे इसके लिए एक बेहतर समाधान मिला। मैं यहाँ चुना हुआ उत्तर देने की कोशिश कर रहा था लेकिन ऐसा लगता है कि .testrunconfig पहले से ही अप्रचलित है।

1. यूनिट टेस्ट के लिए, कॉन्फ्रेंस को लपेटें एक इंटरफ़ेस (IConfig) है

यूनिट परीक्षणों के लिए, विन्यास वास्तव में आपके परीक्षण का हिस्सा नहीं होना चाहिए ताकि एक नकली बनाएं जिसे आप इंजेक्ट कर सकें। इस उदाहरण में मैं Moq का उपयोग कर रहा था।

Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);

2. एकीकरण परीक्षण के लिए, गतिशील रूप से आपको आवश्यक कॉन्फ़िगरेशन जोड़ें

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
    config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");

5

यह बहुत आसान है।

  • अपने परीक्षण प्रोजेक्ट पर राइट क्लिक करें
  • जोड़ें -> मौजूदा आइटम
  • आप ऐड बटन के पास एक छोटा तीर देख सकते हैं
  • "फ़ाइल के रूप में जोड़ें" लिंक पर क्लिक करें

4

यदि आप NUnit का उपयोग कर रहे हैं, तो इस पोस्ट को देखें । मूल रूप से आपको अपने ऐप को अपनी .nunit फ़ाइल के समान निर्देशिका में रखने की आवश्यकता होगी।


मैं अपने यूनिट परीक्षणों के लिए VS08 टीम सिस्टम का उपयोग कर रहा हूं, लेकिन NUnit टिप के लिए धन्यवाद!
जॉर्डन परम

2

यदि आप आवेदन ऐसे Asp.net ConnectionString के रूप में सेटिंग का उपयोग कर रहा है, तो आपको अपने तरीके में विशेषता HostType को जोड़ने की आवश्यकता है, अन्यथा आपके पास App.Config फ़ाइल होने पर भी वे लोड नहीं करेंगे।

[TestMethod]
[HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
public void Test() {

}

0

मैं NUnit का उपयोग करता हूं और मेरी परियोजना निर्देशिका में मेरे पास मेरे App.Config की एक प्रति है जो मैं कुछ कॉन्फ़िगरेशन बदलता हूं (उदाहरण मैं परीक्षण डेटाबेस पर पुनर्निर्देशित करता हूं ...)। आपको इसे परीक्षण किए गए प्रोजेक्ट की उसी निर्देशिका में रखना होगा और आप ठीक हो जाएंगे।


0

मुझे nnnit 2.5.10 के साथ काम करने के लिए इनमें से कोई भी सुझाव नहीं मिल सका, इसलिए मैंने nnnit के प्रोजेक्ट का उपयोग करते हुए समाप्त कर दिया -> कॉन्फ़िगर फ़ाइल को लक्षित करने के लिए निर्दिष्ट करने के लिए कार्यक्षमता संपादित करें (जैसा कि अन्य ने कहा है कि इसे उसी फ़ोल्डर में होना चाहिए। nunit फ़ाइल ही)। इसका सकारात्मक पक्ष यह है कि मैं कॉन्फिगर फाइल को एक Test.config नाम दे सकता हूं जिससे यह स्पष्ट हो जाता है कि यह क्या है और यह क्यों है)


0

आपकी इकाई परीक्षणों को एक पर्यावरण के रूप में माना जाता है जो इसे परीक्षण करने के लिए आपके कोड को चलाता है। किसी भी सामान्य वातावरण की तरह, आपके पास भी मंचन / उत्पादन है। आपको .configअपने परीक्षण प्रोजेक्ट के लिए एक फ़ाइल भी जोड़ने की आवश्यकता हो सकती है । एक वर्कअराउंड एक क्लास लाइब्रेरी बनाने और NUnit और NUnit एडेप्टर जैसे आवश्यक NuGet पैकेजों को जोड़कर टेस्ट प्रोजेक्ट में परिवर्तित करना है। यह Visual Studio Test Runner और Resharper दोनों के साथ पूरी तरह से ठीक काम करता है और आपकी app.configफ़ाइल आपके टेस्ट प्रोजेक्ट में है। यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

और अंत में मेरे परीक्षण और मान को डीबग किया App.config:

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.