Как макет файла конфигурации для модульного теста

У меня есть класс, в котором есть параметр без конструктора. Но когда вызывается этот конструктор, есть пять свойств класса, который получает значения из конфигурационного файла в конструкторе. В классе есть два метода, которые используют параметры, которые инициализируются в конструкторе.

Я хочу написать модульный тест для двух методов, используя макет фреймворка. Но я не уверен, как инициализировать параметры в конструкторе, так как вызов метода не предоставит значение этим свойствам.

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 ответ

Решение

Вы не можете макетировать значения 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 во время выполнения модульного теста.

Другие вопросы по тегам