2009-05-28 13 views
2

Ich habe diese Art von Setup in meiner Visual Studio 2008-Lösung: Ein WCF-Dienstprojekt (WCFService), die Bibliothek (Lib1, die einige Konfigurationseinträge in app.config-Datei benötigt) verwendet. Ich habe ein Unit-Test-Projekt (MSTest), das Tests zu Lib1 enthält. Um diese Tests durchzuführen, benötige ich eine Konfigurationsdatei im Testprojekt. Gibt es eine Möglichkeit, es automatisch von WCFService zu laden, so dass ich die Konfigurationseinträge nicht an zwei Stellen ändern muss?Testprojekt und Konfigurationsdatei

+0

Sie können alle Konfigurationseinträge in einer Datei (oder mehr) sammeln und verwenden Sie die SectionInformation.ConfigSource Eigenschaft auf diese Datei verweisen sowohl von dem WCF-Service-Projekt und das Testprojekt . – charisk

Antwort

2

Wenn Ihre Bibliothek Eigenschaften direkt aus der Datei app.config im gesamten Code liest, wird Ihr Code spröde und schwer zu testen sein. Es wäre besser, eine Klasse zu haben, die dafür verantwortlich ist, die Konfiguration zu lesen und Ihre Konfigurationswerte in einer stark typisierten Weise zu speichern. Lassen Sie diese Klasse entweder eine Schnittstelle implementieren, die die Eigenschaften aus der Konfiguration definiert, oder machen Sie die Eigenschaften virtuell. Dann können Sie diese Klasse ausspotten (indem Sie ein Framework wie RhinoMocks verwenden oder eine falsche Klasse manuell erstellen, die auch die Schnittstelle implementiert). Inject eine Instanz der Klasse in jede Klasse, die Zugriff auf die Konfigurationswerte über den Konstruktor benötigt. Richten Sie es so ein, dass, wenn der injizierte Wert null ist, eine Instanz der richtigen Klasse erstellt wird.

public interface IMyConfig 
{ 
     string MyProperty { get; } 
     int MyIntProperty { get; } 
} 

public class MyConfig : IMyConfig 
{ 
     public string MyProperty 
     { 
     get { ...lazy load from the actual config... } 
     } 

     public int MyIntProperty 
     { 
     get { ... } 
     } 
    } 

public class MyLibClass 
{ 
     private IMyConfig config; 

     public MyLibClass() : this(null) {} 

     public MyLibClass(IMyConfig config) 
     { 
      this.config = config ?? new MyConfig(); 
     } 

     public void MyMethod() 
     { 
      string property = this.config.MyProperty; 

      ... 
     } 
} 

-Test

public void TestMethod() 
{ 
     IMyConfig config = MockRepository.GenerateMock<IMyConfig>(); 
     config.Expect(c => c.MyProperty).Return("stringValue"); 

     var cls = new MyLib(config); 

     cls.MyMethod(); 

     config.VerifyAllExpectations(); 
} 
Verwandte Themen