我是依赖注入(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/