如何模拟配置文件进行单元测试

时间:2017-08-28 09:15:24

标签: unit-testing c#-4.0 moq moq-3

我有一个类,其中有一个参数较少的构造函数。但是当调用此构造函数时,该类有五个属性,它们从构造函数中的配置文件中获取值。类中有两个方法,它使用在构造函数中初始化的参数。

我想使用mock框架为两个方法编写单元测试。但是,我不确定如何在构造函数中初始化参数,因为调用该方法不会为这些属性提供值。

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;
   }
}

提前感谢,

1 个答案:

答案 0 :(得分:4)

你不能模拟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"]);
    }

在你的测试类Mock中,如下所示注入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);

现在你的代码与app.config解耦,你将在运行单元测试时获得a和b的模拟值。