如何为单元测试模拟配置文件
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 的模拟值。
我有一个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 的模拟值。