2009-05-28 8 views
2

私はVisual Studio 2008ソリューションでこの種の設定をしています。ライブラリを使用する1つのWCFサービスプロジェクト(app.configファイルにいくつかの設定エントリが必要なLib1)。私はLib1に関連するテストを含む単体テストプロジェクト(MSTest)を持っています。これらのテストを実行するには、テストプロジェクトにconfigファイルが必要です。 WCFServiceから自動的にロードする方法はないので、2つの場所で設定項目を変更する必要はありませんか?テストプロジェクトと設定ファイル

+0

あなたは一つのファイル(または複数)内のすべての構成エントリを収集し、WCFサービスプロジェクトとテストプロジェクトの両方から、そのファイルを指すようにSectionInformation.ConfigSourceプロパティを使用することができます。 – charisk

答えて

2

あなたのライブラリをapp.configファイルからコード全体に直接読み込むと、コードが脆くなり、テストするのが難しくなります。構成を読み込み、厳密に型付けされた方法で構成値を保管する責任を負うクラスを持つ方がよいでしょう。このクラスに、コンフィグレーションのプロパティを定義するインターフェイスを実装するか、プロパティを仮想化するかを選択します。次に、このクラスをモックすることができます(RhinoMockのようなフレームワークを使用するか、インターフェイスを実装する偽クラスを手作業で作成します)。コンストラクタを介して設定値にアクセスする必要がある各クラスにクラスのインスタンスを注入します。注入された値がnullの場合は、適切なクラスのインスタンスを作成するように設定します。

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(); 
} 
関連する問題