在C#中初始化模拟的构造函数

时间:2016-04-28 20:34:57

标签: c# constructor mocking rhino

无法为

创建模拟
public MetricsProvider(IConfig configData, IMetricsLogger log)
{
    config = configData;
    logger = log;
    oracleDAL = new OracleDataAccess(config, logger);
    MetricsData = new DataCollector();
}

我做的步骤: 为IConfigIMetricsLogger创建一个模拟对象。 我试图调用MetricsProvider(config,logger),但是它引用了 Oracle 连接,无法获得连接或模拟连接对象。

1 个答案:

答案 0 :(得分:0)

这实际上是依赖注入有益的一个完美例子。

你想要的是测试MetricsProvider。但是因为MetricsProvider在内部创建了OracleDataAccessDataCollector的实例,所以如果不对这些类进行测试,则无法测试MetricsProvider

但这些课程依赖于什么?它们是否需要其他依赖项,例如app.config设置,如果不查看这些类的源代码,则无法看到它们? (如果这些类依赖于其他具有更多依赖关系的类,那该怎么办?)

如果您的测试失败,将很难判断缺陷是否在MetricsProvider中,或者是否隐藏在其他类中的某些未知依赖项。

修复它的方法是将接口传递给由OracleDataAccess实现的构造函数。如果该类尚未实现接口,则可以创建与现有类对应的新接口。或者,如果您只需要一个方法,则可以定义一个更具体的接口,并在实现该接口的类中包装OracleDataAccess

然后MetricsProvider将依赖于注入构造函数的接口,您将能够模拟它。由于该模拟功能可让您确切地确定IOracleDataAccess的行为方式,因此您现在可以单独测试MetricsProvider