Bir birim test projesi hedef uygulamanın app.config dosyasını yükleyebilir mi?


151

Yapılandırma özelliklerini yüklemek için bir app.config dosyası kullanan bir .NET uygulamasını (.exe) test ediyorum. Birim sınama uygulamasının kendisinde bir app.config dosyası yoktur.

Yapılandırma özelliklerinden herhangi birini kullanan bir yöntemi test etmeye çalıştığımda, null döndürüyorlar . Bunun birim test uygulamasının hedef uygulamanın app.config dosyasına yüklenmeyeceğinden dolayı olduğunu varsayıyorum.

Bunu geçersiz kılmanın bir yolu var mı veya hedef app.config içeriğini yerel bir app.config dosyasına kopyalamak için bir komut dosyası yazmak zorunda mıyım?

Bu yazı tür bu soruyu soruyor ama yazar gerçekten benden farklı bir açıdan bakıyor.

EDIT: Birim testleri için VS08 Team System kullandığımı belirtmek gerekir.

Yanıtlar:


59

Bunu yapmanın en basit yolu, .configdosyayı birim testinizdeki dağıtım bölümüne eklemektir .

Bunu yapmak için, .testrunconfigdosyayı Çözüm Öğelerinizden açın. Dağıtım bölümünde, çıktıyı ekleyin.config projenizin derleme dizininden (muhtemelen bin\Debug) dosyalarını .

Dağıtım bölümünde listelenen her şey, sınamalar çalıştırılmadan önce sınama projesinin çalışma klasörüne kopyalanır, böylece config bağımlı kodunuz düzgün çalışır.

Düzenleme: Eklemeyi unuttum, bu her durumda çalışmaz, bu nedenle .configbirim testin adıyla eşleşecek şekilde çıktıyı yeniden adlandıran bir başlangıç ​​komut dosyası eklemeniz gerekebilir .


9
Test projesine bir app.config alanı eklemek çok daha kolaydır - o zaman .testrunconfig ile oynamanız gerekmez.
Rowland Shaw

13
@Rowland bunu yaparsanız, app.config dosyasının iki kopyasını saklamanız gerekir. Her iki yerde de app.config dosyasını güncellemeyi hatırlamak zorunda kalmadan, .testrunconfig aracını kullanarak bir kez 10 saniye harcamayı tercih ederim.
Jeromy Irvine

66
Kopyalamayan bir referans ekleyemez misiniz? (Mevcut Öğeyi Ekle ...)
EFraim

6
EFraim'in yorumu kabul edilen cevap olmalı, bu her şeyden çok daha basit.
reggaeguitar

28
EFraim çözümü için: Komut düğmesinden "Bağlantı Olarak Ekle" yi kullandığınızdan emin olun. Aksi takdirde yine de bir kopyasını alırsınız. Ayrıca, soru özellikle bir .Net uygulaması için olsa da, bir web uygulamasının yapılandırması yanlış ada sahip olduğundan (
Web.Config

103

Visual Studio 2008'de app.configdosyayı varolan bir öğe olarak test projesine ekledim ve çoğaltılmadığından emin olmak için bağlantı olarak kopyala'yı seçtim . Bu şekilde çözümümde sadece bir kopya var. Birkaç test projesi ile gerçekten kullanışlı geliyor!

Mevcut Öğe Ekle

Bağlantı Olarak Ekle


7
Mükemmel cevap, basit ve objektif! +1
Custodio

2
Bu en iyi çözümdür ve cevap olarak işaretlenmelidir.
niaher

4
Varolan öğeyi "bağlantı olarak" eklemek için şunları yapmalısınız: "Mevcut Öğe Ekle iletişim kutusunda, bağlamak istediğiniz proje öğesini bulup seçin", ardından: "Aç düğmesi açılır listesinden Bağlantı Olarak Ekle'yi seçin. "
uriel

Bu benim için harika çalıştı. İşe yaramayacağı bir durum düşünmeye çalışıyorum ... Ve şimdi yeterince düşündüm. Teşekkürler!
Dudeman3000

53

İster Ekip Sistem Testi ister NUnit kullanıyor olun , en iyi uygulama testleriniz için ayrı bir Sınıf Kütüphanesi oluşturmaktır. Test projenize bir App.config eklediğinizde, derlediğinizde bin klasörünüze otomatik olarak kopyalanır .

Kodunuz belirli yapılandırma testlerine güveniyorsa, yazacağım ilk test, yapılandırma dosyasının kullanılabilir olduğunu doğrular ( böylece deli olmadığımı biliyorum ):

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

Ve test:

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

İdeal olarak, konfigürasyon nesneleriniz sınıflarınıza geçecek şekilde kod yazmalısınız. Bu sizi yalnızca yapılandırma dosyası sorunundan ayırmakla kalmaz, aynı zamanda farklı yapılandırma senaryoları için testler yazmanıza da olanak tanır.

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
Burada konfigürasyon bağımlılığını geçirme ruhuna katılıyorum, bu cevaplanmış gibi görünüyor, Mark Seemann tarafından daha az değil! burada: Eksik .config dosyası nedeniyle başarısız birim testleri
Shaun

"Satırında eksik: string value = ConfigurationManager.AppSettings [" TestValue]; Düzeltmeye çalıştım, ancak bir düzenleme yapmama izin vermek için stackoverflow almak için düzeltmek için başka bir 5 karakter bulmak zorunda kalacaktı.
Jane

22

Örneğin Web Uygulaması ve Test Projesi içeren bir çözümünüz varsa, Test Projesi'nin Web Uygulamasının web.config dosyasını kullanmasını isteyebilirsiniz.

Çözmenin bir yolu, projeyi test etmek için web.config dosyasını kopyalamak ve app.config olarak yeniden adlandırmaktır.

Başka ve daha iyi bir çözüm, yapı zincirini değiştirmek ve projelerin çıktı dizinini test etmek için web.config dosyasının otomatik kopyasını yapmaktır. Bunu yapmak için Uygulamayı Test Et'e sağ tıklayın ve özellikleri seçin. Şimdi proje özelliklerini görmelisiniz. "Etkinlik Oluştur" u ve ardından "Üretim Sonrası Düzenle ..." düğmesini tıklayın. Oraya aşağıdaki satırı yazın:

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

Ve Tamam'ı tıklayın. (Test etmek istediğiniz proje adını yazarken büyük olasılıkla WebApplication1'i değiştirmeniz gerektiğini unutmayın). Web.config dosyasının yanlış yolu varsa, kopyalama başarısız olur ve başarısız derleme sırasında bunu fark edersiniz.

Düzenle:

Mevcut Projeden Test Projesine Kopyalamak için:

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

Gerçekten güzel bir çözüm. Bu, .configdosyaları kopyalamaktan ve çoğaltmaktan kaçınmamı sağladı . Paylaşım için teşekkürler! :)
Leniel Maccaferri

Çok güzel bir çözüm! Çok teşekkürler.
Vin Shahrdar

Güzel bir çözüm, ancak ana web.configsadece .configaynı proje içindeki harici dosyalara referans olduğunda ne olur . Yol yalnızca aynı dizindeki klasörleri (normalde doğrudur) gösterebildiğinden, testleri çalıştırırken bu harici dosyaları işleyemez. Nasıl çözüleceği hakkında bir fikrin var mı?
Sugafree

Bu benim için çalıştı: kopya "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Andrew

8

Bu biraz eski ama bunun için daha iyi bir çözüm buldum. Burada seçilen cevabı deniyordum ama .testrunconfig zaten eski gibi görünüyor.

1. Birim Testleri için, yapılandırmayı bir Arabirimdir (IConfig)

Birim testleri için, yapılandırma gerçekten testinizin bir parçası olmamalıdır, bu yüzden enjekte edebileceğiniz bir sahte oluşturun. Bu örnekte Moq kullanıyordum.

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

2. Entegrasyon testi için ihtiyacınız olan yapılandırmayı dinamik olarak ekleyin

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

Bu çok kolay.

  • Test projenize sağ tıklayın
  • Ekle -> Mevcut öğe
  • Ekle düğmesinin hemen yanında küçük bir ok görebilirsiniz
  • Yapılandırma dosyasını seçmek için "Bağlantı Olarak Ekle" ye tıklayın

4

NUnit kullanıyorsanız, bu gönderiye bir göz atın . Temel olarak app.config dosyanızın .nunit dosyanızla aynı dizinde olması gerekir.


Ünite testleri için VS08 Team System kullanıyorum ama NUnit ipucu için teşekkürler!
Jordan Parmer

2

Uygulama Asp.net ConnectionString gibi bir ayar kullanıyorsa, yönteminize HostType özniteliğini eklemeniz gerekir, aksi takdirde bir App.Config dosyanız olsa bile yüklenmez.

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

}

0

NUnit kullanın ve benim proje dizinde bazı yapılandırma (örnek bir test veritabanına yönlendirmek ...) değiştirmek benim App.Config bir kopyası var. Test edilen projenin aynı dizinine sahip olmanız gerekir ve iyi olacaksınız.


0

Bu önerilerin hiçbirini nUnit 2.5.10 ile çalışmak için alamadım, bu yüzden nUnit'in Project -> Düzenle işlevselliğini kullanarak hedeflenen yapılandırma dosyasını belirtmek için sona erdi (diğerleri gibi aynı klasörde olması gerektiğini söyledi. nunit dosyasının kendisi). Bunun olumlu tarafı, yapılandırma dosyasına ne olduğunu ve neden olduğunu daha açık hale getiren bir Test.config adı verebilmemdir)


0

Birim testleriniz, kodunuzu test etmek için çalıştıran bir ortam olarak kabul edilir. Her normal ortam gibi, evreleme / üretim de vardır. .configTest projeniz için de bir dosya eklemeniz gerekebilir . Çözüm, bir sınıf kitaplığı oluşturmak ve NUnit ve NUnit Bağdaştırıcı gibi gerekli NuGet paketlerini ekleyerek onu Test Projesine dönüştürmektir. Visual Studio Test Runner ve Resharper ile mükemmel çalışır ve app.configdosyanızı test projenizde bulabilirsiniz. resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Ve nihayet test ve değerimin hatalarını ayıkladım App.config:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.