Как макет файла конфигурации для модульного теста
У меня есть класс, в котором есть параметр без конструктора. Но когда вызывается этот конструктор, есть пять свойств класса, который получает значения из конфигурационного файла в конструкторе. В классе есть два метода, которые используют параметры, которые инициализируются в конструкторе.
Я хочу написать модульный тест для двух методов, используя макет фреймворка. Но я не уверен, как инициализировать параметры в конструкторе, так как вызов метода не предоставит значение этим свойствам.
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 во время выполнения модульного теста.