3

我正在尝试为一个简单的工厂类编写一个单元测试,该类创建几个可能的实现对象之一并将其作为接口引用返回。

DUnit 有一个内置过程 ,CheckIs(AObject: TObject; AClass: TClass; msg: string)如果对象的类类型与预期的不匹配,则基于它的名称和它接受的参数应该无法通过测试。唯一的问题是它需要对象引用而不是接口引用。

因此,我尝试CheckTrue在测试主体中使用和执行比较,但我对 Delphi 的类型检查支持不像 C# 那样熟悉。

我知道is运算符是不可能的,因为它只适用于对象引用。

CheckTrue(LMyInterfaceReference {comparison here} TMyClass);

有什么建议么?

顺便说一句,我使用的是 Delphi 2009,所以我无法访问 2010+ 中添加的新 RTTI 支持。

4

3 回答 3

4

如果您不喜欢 hack 并且不想升级到 Delphi 2010+,您可以使用如下界面:

IImplementingObjectInterface = interface
  function GetImplementingObject: TObject;
end;

确保您的对象也实现此接口并使用它来提取实现对象。如果您需要对很多对象执行此操作,您可以定义自己的TInterfacedObject已实现此功能的派生,因此您可以简单地更改继承并完成。

于 2011-03-04T17:04:10.153 回答
4

我想知道为什么你必须测试这个......也许你真的不需要。

但是,如果必须了解接口的底层对象,您有两种选择:

  • 向接口添加一个方法,该方法返回底层对象,只是一个 TObject,并在每个类中通过返回 self 来实现它。
  • 破解一下,例如使用这个接口到对象例程。
于 2011-03-04T16:55:59.210 回答
1

Barry Kelly (Embarcadero Delphi 编译器的主要工程师之一)本周写了一个不错的 An丑陋替代接口到对象转换。

它回答了你的问题。

有趣的是,Hallvard Vassbotn在 2004 年写了一段非常相似的代码

从 Delphi 2010 开始,您可以使用is检查或as强制类型转换从接口引用返回到对象引用。

——杰伦

于 2011-03-04T21:48:07.873 回答