如何使用工厂 class 遵循 TDD 原则

How to follow TDD principles with class using factories

我试图通过遵循 TDD 来激励我的团队提高我们的开发技能。这是一次很棒的体验,但在某些时候我注意到他们中的大多数人由于以下问题而停止这样做:

1/ 我们正在开发 "brokers" 在某些事情发生时触发,旨在执行一组操作(发送电子邮件、处理数据、转换文件...)。

2/ 由于简单的 Activator.CreateInstance(brokerType),应用程序启动时会加载所有代理。

3/ 我们的一位经纪人应该从 excel 文件中提取记录并尝试在数据库中查找相关记录。为此,我们只需使用以下代码:

public void Process(string file)
{
    using (var sun = new SunSystemExcelDataSource(ExcelDatasourceFactory.Create(file)))
    {//...}
}

此代码调用工厂返回 class(继承自 IExcelSource)能够解析指定的 excel 文件(XLS 与 XLSX),然后将其作为参数传递SunSystemExcelDataSource 的构造函数。

问题:此方法变得难以测试。我想知道您是否可以给我们一些提高代码测试能力的技巧。

一般来说如何测试class依赖工厂自建的es?

代码:

public void Initialize(ILog log, AppSettings settings)
{
    _log = log;
    _hrdb = DbDatasourceFactory.CreateHrdbDatasource(settings.HrdbConnectionString);
    _processor = new K2Processor(settings.SettlePaymentWorkflow);
    _sunFolderPath = settings.SunSystemExcelFolderPath;
}

Moq 库不支持静态方法。但是我们可以使用 Microsoft Shims 和 Fakes。

https://msdn.microsoft.com/en-us/library/hh549175.aspx

我们仍然可以使用 Moq,但是为此我们必须将代码修改成这样,

public void Initialize(ILog log, AppSettings settings)
{
    Initialize(log, settings, DbDatasourceFactory.CreateHrdbDatasource(settings.HrdbConnectionString);
}

// Unit-test this method,
internal void Initialize(ILog log, AppSettings settings, HrdbDataSource hrdbDataSource)
{
    _log = log;
    _hrdb = hrdbDataSource;
    _processor = new K2Processor(settings.SettlePaymentWorkflow);
    _sunFolderPath = settings.SunSystemExcelFolderPath;
}