我正在做的单元测试类滚动数据库表的每条记录,并将字段中的值求和为先前的值。以下是简化的类:

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界面切换为使用它。

另一种选择是通过添加到其构造函数的参数将数据馈入类。这样,您甚至不需要额外的方法,因此就不会在接口或生产类上定义该方法。您的模拟类的构造函数没有必要看起来像生产类的构造函数,因为这些类根本不相关。构造函数不是接口定义的一部分。

10-05 20:40
查看更多