【发布时间】:2014-02-03 15:33:13
【问题描述】:
我正在执行单元测试的课程滚动数据库表的每条记录,并将字段中的值与前一个值相加。以下是精简到骨子里的类:
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 的 DB 模拟接口。
以下是依赖注入的数据库模拟:
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),它可以完成这项工作,但在这种情况下,我最终也会在生产中使用这个额外的过程,我不需要它。
这方面的最佳做法是什么?
我在 Delphi 框架中使用 Spring
【问题讨论】:
-
缺少一点信息:TSumList 如何知道IIDBTable?另外:额外的方法可以在 TMockDBTable 上,而不是在接口上。或者你可以在 TMockDBTable 的构造函数中传递数据
-
您需要在
TMockDBTable中实现模拟功能。由于TMockDBTable提供了在测试时使用的IDBTable的实现,因此您需要使TMockDBTable能够接收模拟数据。我不明白您为什么认为需要在生产代码中添加任何内容。您没有在生产代码中添加TMockDBTable是吗?
标签: delphi unit-testing mocking spring4d