我有一个类,其中有一个参数较少的构造函数。但是当调用此构造函数时,该类有五个属性,它们从构造函数中的配置文件中获取值。类中有两个方法,它使用在构造函数中初始化的参数。
我想使用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;
}
}
提前感谢,
答案 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的模拟值。