我仍在尝试沿着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
答案 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)
中连接该方法。
您可能还希望查看更大的集成级别测试,在其中传递IExcelDatasourceFactory
,IK2DatasourceFactory
,IDbDatasourceFactory
的具体版本并更深入地运用系统。
在书Growing Object-Oriented Software Guided by Tests中,这将被定义为验收测试,它将在工作开始之前编写,并且在将功能添加到较小的TDD功能循环中时失败,努力实现整体功能。