当您的方法设计用于执行许多任务时如何使用TDD

时间:2016-06-02 07:21:33

标签: c# unit-testing tdd

我仍在尝试沿着TDD的路径前进。

假设我将文件上传到共享文件夹时触发了SunSystemBroker。此代理旨在打开此文件,从中提取记录,尝试在其他系统中查找关联的付款,最后调用工作流程!

  

如果我想跟随TDD开发IBroker.Process()方法,我该怎么办?

注意:Broker是从IBroker继承并由控制台应用程序(如插件)加载的独立程序集。

  

此控制台负责触发每个经纪人!

public interface IFileTriggeredBroker : IBroker
{
    FileSystemTrigger Trigger { get; }
    void Process(string file);
}

public class SunSystemPaymentBroker : IFileTriggeredBroker
{
    private readonly IDbDatasourceFactory _hrdbFactory;
    private readonly IExcelDatasourceFactory _xlFactory;
    private readonly IK2DatasourceFactory _k2Factory;
    private ILog _log;

    public void Process(string file)
    {
        (...)
        // _xlFactory.Create(file) > Extract
        // _hrdbFactory.Create() > Find
        // Compare Records
        // _k2Factory.Create > Start
    }
}

每种方法都单独测试。

谢谢 SEB

2 个答案:

答案 0 :(得分:1)

你有两个不同的问题:

1)一种方法旨在执行许多任务 使您的代码保持SOLID,并应用单一责任原则。 拆分单一责任方法:即只负责一项任务。

2)你想测试一个副作用(改变环境)而不是纯函数的程序。 所以,我建议你在纯函数调用中分割你的代码(即:没有副作用)。

另请阅读https://msdn.microsoft.com/en-us/library/aa730844%28v=vs.80%29.aspx

答案 1 :(得分:1)

鉴于你说每种方法:

_xlFactory.Create(file);
_hrdbFactory.Create();

// Compare Records
_k2Factory.Create();
单独测试

,在Process(file)内测试的逻辑非常少。

如果你使用像Moq这样的东西,你可以检查是否发生了呼叫:

// Arrange
const string File = "file.xlsx";
var xlFactory = new Mock<IExcelDatasourceFactory>();
var hrbdFactory = new Mock<IDbDatasourceFactory>();
var k2Factory = new Mock<IK2DatasourceFactory>();

// Act
var sut = new SunSystemPaymentBroker(xlFactory.Object, hrdbFactory.Object, k2Factory.Object); // I'm assuming you're using constructor injection
sut.ProcessFile(File);

// Assert
xlFactory.Verify(m => m.Create(File), Times.Once);
hrbdFactory.Verify(m => m.Create(), Times.Once);
k2Factory.Verify(m => m.Create(), Times.Once);

为了简洁起见,我已将其作为单个测试完成,但使用单个“断言”(verify调用)进入3个测试更为现实。对于TDD,您可以编写每个测试,然后在Process(file)中连接该方法。

您可能还希望查看更大的集成级别测试,在其中传递IExcelDatasourceFactoryIK2DatasourceFactoryIDbDatasourceFactory的具体版本并更深入地运用系统。

在书Growing Object-Oriented Software Guided by Tests中,这将被定义为验收测试,它将在工作开始之前编写,并且在将功能添加到较小的TDD功能循环中时失败,努力实现整体功能。