2017-05-12 29 views
7

Visual Studio 2017'deki bir Visual Basic web projesi için ortam değişkenlerini proje özellikleri sayfasını kullanarak ayarlarsanız, Environment.GetEnvironmentVariable kullanarak değişkenin değerini okuyabilir; Ancak, xUnit test projem için ortam değişkenini ayarlayıp testte hata ayıkladığımda, Environment.GetEnvironmentVariable her zaman null değerini döndürür. Değişkenin web projesinde olduğu gibi kullanılmasını engelleyen bir test projesi olmasıyla ilgili bir şey var mı? Öyleyse, bir test projesi için ortam değişkenlerini ayarlayabilmem için bir yol var mı? Teşekkür ederim.GetUnvironmentVariable xUnit Testinde Çalışmalı mı?

+2

Lütfen bir test projesi için ortam değişkenlerini nasıl ayarlayacağınızı gösterin. –

+0

@Ilya, Nasıl yapılacağını bilerek ekran görüntüsü ekleyebilirim. Visual Studio 2017'de, birim sınama projesinin Özellikler penceresini açın. Hata Ayıklama sekmesinde, Ortam Değişkenlerini girebileceğiniz bir kılavuz vardır. Web projeme özel bir tane eklediğimde, hata ayıkladığımda okuyabilirim, ancak birim sınama projesinde bir tane belirlediğimde, değer null olarak okunur. – Eric

cevap

9

GetEnvironmentVariable, xUnit testlerinde düzgün çalışıyor. sorunu, bir değişken doğru şekilde ayarlanmasıdır. Değişkeni Properties -> Debug sayfasında ayarlarsanız, değişken Properties\launchSettings.json'a yazılır ve Visual Studio, tüm çalışmaların seçilen profille bir uygulama başlatmasını sağlar. Görebildiğiniz gibi, launchSettings.json, çıktı klasörüne varsayılan olarak kopyalanamaz. Bu dosyayı dotnet run veya dotnet test'a argüman olarak iletmek imkansızdır, bu da eğer testler otomatik olarak bir CI sunucusunda çalıştırılırsa bariz bir soruna yol açar. Bu nedenle, launchSettings.json'un bir test koşucusu tarafından dikkate alınmaması şaşırtıcı değildir.

Çözüm:

  • Oluşturucu
  • Taban sınıfı
  • Fixture

Örneğin, bu koleksiyon fikstürü: kurulum için yollar xUnit bir test ortamı bir yeri vardır tüm ortam değişkenlerini launchSettings.json:

'dan ayarlar.
public class LaunchSettingsFixture : IDisposable 
{ 
    public LaunchSettingsFixture() 
    { 
     using (var file = File.OpenText("Properties\\launchSettings.json")) 
     { 
      var reader = new JsonTextReader(file); 
      var jObject = JObject.Load(reader); 

      var variables = jObject 
       .GetValue("profiles") 
       //select a proper profile here 
       .SelectMany(profiles => profiles.Children()) 
       .SelectMany(profile => profile.Children<JProperty>()) 
       .Where(prop => prop.Name == "environmentVariables") 
       .SelectMany(prop => prop.Value.Children<JProperty>()) 
       .ToList(); 

      foreach (var variable in variables) 
      { 
       Environment.SetEnvironmentVariable(variable.Name, variable.Value.ToString()); 
      } 
     } 
    } 

    public void Dispose() 
    { 
     // ... clean up 
    } 
} 

Dosyayı testlerden erişilebilir hale getirmek için launchSettings.json için Copy to output directory: Always değerini ayarlayın.

+0

Harika çözüm @Ilya. Gönderdiğiniz için teşekkürler. LaunchSettings.json dosyasını bile bilmiyordum. – Eric

+0

@Eric, iyi soru için teşekkürler. Aslında test ortamını kurmak için 'launchsettings.json 'kullanmıyoruz. Bunun yerine, basitleştirilmiş bir json anahtar/değer dosyası oluştururuz. Çözümdeki tüm entegrasyon test projeleri için bağlantı olarak paylaşılır. Birden çok ortam/profile sahip olmanız gerekiyorsa, ASP.NET Core'daki 'appsettings.json' için yapılan gibi bir yapılandırma dönüşümü düşünün. –

İlgili konular