我正在尝试为一个简单的工厂类编写单元测试,该工厂类创建几个可能的实现对象之一并将其作为接口引用返回。
DUnit有一个内置过程CheckIs(AObject: TObject; AClass: TClass; msg: string)
,如果对象的类类型与预期的类型不匹配,则基于其名称及其接受的参数将导致测试失败。唯一的问题是它需要一个对象引用而不是一个接口引用。
所以我正在尝试使用CheckTrue
并在测试主体中进行比较,但我不熟悉Delphi的类型检查支持,就像我使用C#一样。
我知道is
运算符是不可能的,因为它只适用于对象引用。
CheckTrue(LMyInterfaceReference {comparison here} TMyClass);
有什么建议吗?
顺便说一下,我正在使用Delphi 2009,所以我无法访问2010年增加的新RTTI支持。答案 0 :(得分:4)
我想知道为什么你必须要测试这个...也许你真的不需要。
但是如果知道接口的底层对象是必须的,那么你有两个选择:
答案 1 :(得分:4)
如果你不喜欢黑客并且不想升级到Delphi 2010+,你可以使用这样的界面:
IImplementingObjectInterface = interface
function GetImplementingObject: TObject;
end;
确保您的对象也实现此接口并使用它来提取实现对象。如果您需要为很多对象执行此操作,您可以定义已经实现此功能的TInterfacedObject
派生,这样您就可以简单地更改继承并完成。
答案 2 :(得分:1)
Barry Kelly(主要的Embarcadero Delphi编译工程师之一)本周写了一篇不错的An ugly alternative to interface to object casting。
它回答了你的问题。
有趣的是Hallvard Vassbotn写了very similar piece of code back in 2004。
从Delphi 2010开始,您可以使用is
检查或as
强制转换从接口引用返回到对象引用。
- 的Jeroen