TList<;T>;。使用Delphi mock对返回值mock进行计数

TList<;T>;。使用Delphi mock对返回值mock进行计数,delphi,delphi-mocks,Delphi,Delphi Mocks,在我的单元测试中,需要设置模拟的TList。如何为模拟的TList.count属性读取设置返回值 当我在之后使用count时编译器错误消息为: [dcc32 Error] Unit1.pas(40): E2014 Statement expected, but expression of type 'Integer' found [dcc32 Error] Unit1.pas(40): E2003 Undeclared identifier: 'getCount' 当我在When之后使用ge

在我的单元测试中,需要设置模拟的
TList
。如何为模拟的
TList.count
属性读取设置返回值

当我在
之后使用
count
编译器错误消息为:

[dcc32 Error] Unit1.pas(40): E2014 Statement expected, but expression of type 'Integer' found
[dcc32 Error] Unit1.pas(40): E2003 Undeclared identifier: 'getCount'
当我在
When
之后使用
getCount
时,编译器错误消息是:

[dcc32 Error] Unit1.pas(40): E2014 Statement expected, but expression of type 'Integer' found
[dcc32 Error] Unit1.pas(40): E2003 Undeclared identifier: 'getCount'
count
属性直接读取
fCount
属性。有什么解决办法吗

type
  TMyClass = class
  end;

procedure TXXXTestCase.testYYY;
var
  mL : TMock<TList<TMyClass>>;
begin
  mL := TMock<TList<TMyClass>>.create;
  try
    // ...
    mL.Setup.WillReturn( 1 ).When.Count;
    // ...
  finally
    mL.Free;
  end;
end;
类型
TMyClass=类
结束;
程序txxtestcase.testYYY;
变量
mL:TMock;
开始
mL:=TMock.create;
尝试
// ...
mL.Setup.WillReturn(1).When.Count;
// ...
最后
mL.免费;
结束;
结束;

好的。受Stefan Glienke评论的启发,我创建了一个实用程序Cals,以避免访问。。。模拟对象的。我只是将mock传递给utility类的mock,以获得(假)值

代码狙击手看起来像我原来的一个:

value = object1.property.list.count;
这种深层外观的解决方案是:

value = object1Utility.getListCount( object );

Tobjec1tutibility调用Object2实用程序来响应,但在这种情况下,我可以模拟Object1实用程序,无需将模拟添加到模拟中。

除非使用低级挂钩,否则模拟
计数
值的唯一方法是将虚拟值添加到列表中。至于
时,mock看起来只能处理使用虚拟getter方法的属性读取(因此它可以钩住这些方法)。此外,类似于
MyList.Count的语句在Delphi中仍然无效(相同的编译器错误)。您必须将您的
Count
签入另一个与Mocks兼容的类/方法。是的,我的想法是相同的:将继承的TList与getCount虚拟方法一起使用,或创建函数getListCount(aL_:TList):integer begin aL_.Count;结束;方法,然后是用户类。他们都是黑客。重构代码只是为了能够进行测试。但方向不对(模拟列表是个坏主意,只需将您希望它包含的值放入其中即可。@StefanGlienke yes。除非列表的容器也是模拟的。:)然后您告诉它给您一个列表,其中包含您想要的值。FWIW: