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

How to mock config file for unit test

我有一个class,其中有一个无参数构造函数。但是当调用这个构造函数时,class 有五个属性从构造函数的配置文件中获取值。 class 中有两个方法使用在构造函数中初始化的参数。

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

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

提前致谢,

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

然后在你的测试中 class 模拟并注入 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 的模拟值。