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

constructor with initialization mock in C#

无法为

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

我做的步骤: 为 IConfigIMetricsLogger 创建模拟对象。 我试图调用 MetricsProvider(配置,记录器),但它引用 Oracle 连接并且无法获取连接或模拟连接对象。

这实际上是依赖注入为何有益的完美示例。

你要的是测试MetricsProvider。但是因为 MetricsProvider 在内部创建了一个 OracleDataAccessDataCollector 的实例,你不能在不测试那些 class 的情况下测试 MetricsProvider

但是那些 class 依赖于什么?它们是否需要额外的依赖项,例如 app.config 设置,如果不查看那些 class 的源代码就无法看到? (如果那些 classes 依赖于其他具有更多依赖性的 classes 怎么办?)

如果您的测试失败,将很难判断缺陷是在 MetricsProvider 中还是隐藏在其他 class.

中的某些未知依赖项中

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

然后 MetricsProvider 将取决于注入到您可以模拟的构造函数中的接口。由于该模拟将使您能够准确确定 IOracleDataAccess 的行为方式,现在您将能够单独测试 MetricsProvider