delphi - 测试未在接口(interface)部分声明的类

标签 delphi delphi-xe2 spring4d

我是依赖注入(inject)容器的新手,我正在尝试将它们与模拟结合使用。

假设我有一个 Controller 和一个列表(模型):

IBlahList = interface
  property Items[AIndex: integer]: IBlah read GetItem;
end;

IController = interface
  property List: IBlahList read GetList;
end;

IController 的实现看起来像这样(注意,它位于 implementaion 部分:

implementation

TController = class (TInterfacedObject, IController)
private
  FList: IBlahList;
  function GetList: IBlahList;

public
  constructor Create(const AList: IBlahList);

end;

然后,当然,我会使用 GlobalContainer 注册这个类(以及 IBlahList 的类):

GlobalContainer.RegisterType<TController>.Implements<IController>;

按照各种来源(好吧,无论如何,Nick Hodges!)的建议,我将 TController 放在 implementation 部分中,这样我们就不能直接引用 TController 类。

现在,只需说我想在单元测试中测试 ICollection 的实现:

procedure TestSomething
var
  LMockList: TMock<IBlahList>;
  LController: IController;
begin
  LMockList := TMock<IBlahList>.Create;

  // Oops, I can't do this, I can't access TController
  LController := TController.Create(LMockList);

end;

所以,我的问题是,我应该将 TController 类移到我的 interface 部分以便我可以测试它,还是有其他方法将模拟 IBlahList 传递到我尚未使用的 Controller 找到吗?

最佳答案

如果您在实现部分中有具体的类,那么您可以公开一个工厂函数(即在接口(interface)部分中),该函数创建具有所需参数的 IController。

在我看来,拥有一个无法实例化的实现是绝对没有意义的。

interface

...

function CreateController(AList: IBlahList): IController;

implementation

function CreateController(AList: IBlahList): IController;
begin
  Result := TController.Create(AList);
end;

关于delphi - 测试未在接口(interface)部分声明的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962366/

相关文章:

delphi 2010 datasnap从服务器返回 TreeView

delphi - 为什么 dcc64 说这个值从未被使用过?

delphi - SerAndDeser.pas(298) : W1036 Variable 'tForm' might not have been initialized

delphi - 如何在 Spring4d 中创建和使用不区分大小写的 IList<string>

delphi - 无法获得 Spring4D 加密示例的预期结果

delphi - 为什么 TValue.Make 需要一个指向对象引用的指针?

delphi - 在delphi中使用SelectDirectory时从根目录向上搜索

delphi - 监视单个文件更改的最简单方法是什么?

delphi - 如何防止Delphi应用程序在启动时创建GLScene日志文件?

Delphi:相同类型的不同PTypeInfo