2009-05-28 129 views
2

我在Visual Studio 2008解決方案中有這種設置:一個WCF服務項目(WCFService)使用庫(Lib1,它需要app.config文件中的一些配置項)。我有一個單元測試項目(MSTest),其中包含與Lib1相關的測試。爲了運行這些測試,我需要一個測試項目中的配置文件。有沒有辦法從WCFService自動加載它,所以我不需要在兩個地方更改配置條目?測試項目和配置文件

+0

可以收集在一個文件中(或幾個)的所有配置條目和使用SectionInformation.ConfigSource屬性來自WCF服務項目和測試項目指向該文件。 – charisk 2009-05-28 11:46:59

回答

2

讓您的庫直接從app.config文件直接讀取代碼中的屬性,這會讓您的代碼變得脆弱而難以測試。最好有一個類負責讀取配置並以強類型的方式存儲配置值。讓這個類實現一個接口,該接口定義配置中的屬性或使屬性變爲虛擬。然後你可以嘲笑這個類(使用像RhinoMocks這樣的框架,或者手工製作一個也實現了界面的假類)。將類的實例注入每個需要通過構造函數訪問配置值的類中。設置它,以便如果注入的值爲空,則它創建適當類的實例。

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; 

      ... 
     } 
} 

測試

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

     var cls = new MyLib(config); 

     cls.MyMethod(); 

     config.VerifyAllExpectations(); 
}