我正在做的单元测试类滚动数据库表的每条记录,并将字段中的值求和为先前的值。以下是简化的类:
procedure TSumList.Sum;
var
FSum:integer;
begin
FSum:=0;
FDB.First;
while not FDB.EOF do
begin
FSum:=FSum+FDB.GetAmount;
FDB.Next;
end;
end;
FDB是指名为IIDBTable的数据库模拟接口。
以下是用于依赖项注入的数据库模拟:
IIDBTable = interface
['{A299D1D6-93AF-45CC-8DE2-9A4EE188C352}']
procedure First;
procedure Next;
function EOF : boolean;
function GetAmount:integer;
end;
TMockDBTable = class (TInterfacedObject,IDBTable)
procedure First;
procedure Next;
function EOF : boolean;
function GetAmount:integer;
end;
问题是我不知道如何为模拟提供数据以进行测试。当然,我可以添加一个额外的过程,例如AddValues(aAmount:integer)来完成这项工作,但在那种情况下,我最终也会在生产中得到这个额外的过程,因此我不需要它。
最佳做法是什么?
我将Spring用于Delphi框架
最佳答案
向模拟类AddValues
添加一个额外的方法。它只会存在于该模拟类中,而不存在于真实类中,因此您对多余代码将出现在生产环境中的反对是没有根据的。
我怀疑您认为代码需要在生产中使用,因为您仅通过接口处理模拟对象。额外的方法将存在于接口中,因此,即使它不属于该类,也需要在该类的生产版本中实现。
相反,实例化TMockDBTable
并通过对象引用对其进行访问以进行设置,但是测试需要它。准备就绪后,请通过IIDBTable
界面切换为使用它。
另一种选择是通过添加到其构造函数的参数将数据馈入类。这样,您甚至不需要额外的方法,因此就不会在接口或生产类上定义该方法。您的模拟类的构造函数没有必要看起来像生产类的构造函数,因为这些类根本不相关。构造函数不是接口定义的一部分。