2017-08-28 9 views
0

パラメータが少ないコンストラクタがあるクラスがあります。しかし、このコンストラクタが呼び出されると、コンストラクタの設定ファイルから値を取得するクラスの5つのプロパティがあります。クラスには、コンストラクタで初期化されるパラメータを使用する2つのメソッドがあります。単体テスト用の設定ファイルを模擬する方法

モックフレームワークを使用して2つのメソッドの単体テストを作成したいと思います。しかし、メソッドを呼び出すと、それらのプロパティに値を提供しないので、コンストラクタのパラメータを初期化する方法がわかりません。事前に

public class ABC 
{ 
    public ABC() 
    { 
     a = ConfigurationManager.AppSetting["GetValue"]; 
     b = ConfigurationManager.AppSetting["GetValue1"]; 
    } 

    public int Method1(IDictionary<string, string> dict) 
    { 
     d = a + b /2; (how to mock values of a and b while writing unit tests 
        using mock framework. In reality, a in my case is 
        dictionary) 

//some business logic 

     return d; 
    } 
} 

感謝し、

+0

コンストラクタが 'ConfigurationManager'に密接に結合されているので、嘲笑はありません。ただし、単体テストのapp.configに必要なキー/値のペアを追加できます。提供された情報がどのくらい疎かであるかを考えると、これ以上のことは言えません。実際の問題を複製し、可能な解決策を構築するのに役立つプロバイダーa [mcve] – Nkosi

+0

configurationmanagerの周りにラッパーを使用し、ラッパー・タイプをモックします。 [こちら](https://stackoverflow.com/questions/9486087/how-to-mock-configurationmanager-appsettings-with-moq) – Nilesh

答えて

2

あなたはあなたのコードのようにaとbのモック値はしっかりのapp.configファイルに結合されていることができません。インターフェイスを作成することができます。あなたのコンストラクタにインタフェースを注入し、それを模擬するには、以下のようなリファクタリング、コード、

public class ABC 
    { 
     private int a; 
     private int b; 
     public ABC(IConfig config) 
     { 
      a = config.a; 
      b = config.b; 
     } 

     public int Method1(IDictionary<string, string> dict) 
     { 
      int d = a + b/2; 

      return d; 
     } 
    } 

    public interface IConfig 
    { 
     int a { get; } 
     int b { get; } 
    } 
    public class Config : IConfig 
    { 
     public int a => Convert.ToInt32(ConfigurationManager.AppSettings["GetValue"]); 
     public int b => Convert.ToInt32(ConfigurationManager.AppSettings["GetValue1"]); 
    } 

そして、あなたでモッククラスをテストし、以下のようなIConfigを注入し、

Mock<IConfig> _mockConfig = new Mock<IConfig>(); 

     _mockConfig.Setup(m => m.a).Returns(1); 
     _mockConfig.Setup(m => m.b).Returns(2); 

     ABC abc = new ABC(_mockConfig.Object); 

今、あなたのコードは、アプリで分離されています。 configを実行すると、aとbのモック値が得られます。

+0

ありがとうございます@ Vijaynath。それは素晴らしい解決策です。 – Vicky

関連する問題