【发布时间】:2013-03-23 01:17:48
【问题描述】:
我开始使用Delphi-Mocks 框架,但在模拟一个在构造函数中有参数的类时遇到了麻烦。 TMock 的类函数“Create”不允许参数。如果尝试创建 TFoo.Create( Bar: someType ); 的模拟实例当 TObjectProxy.Create 时,我得到一个参数计数不匹配;尝试调用 T 的 'Create' 方法。
显然这是因为以下代码没有将任何参数传递给“Invoke”方法:
instance := ctor.Invoke(rType.AsInstance.MetaclassType, []);
我创建了一个可以传入参数的重载类函数:
class function Create( Args: array of TValue ): TMock<T>; overload;static;
并且正在使用我所做的有限测试。
我的问题是:
这是一个错误还是我做错了?
谢谢
PS:我知道 Delphi-Mocks 以接口为中心,但它确实支持类,而且我正在处理的代码库是 99% 的类。
【问题讨论】:
-
这是我不明白的。如果您尝试模拟一个类,为什么要创建您正在模拟的类的实例。当然,嘲弄的全部意义在于你,嗯,嘲弄班级。
-
当您执行
TMock<TFoo>.Create时,Mocks 框架会创建一个TFoo的实例。也许我不理解模拟,但我认为重点在于您创建的东西不是TFoo。我的意思是,如果您只需要创建TFoo,那就去做吧。如果你想模拟它,那么找到一个框架来创建一个模拟TFoo而不是TFoo的实例。 -
@大卫。对不起,我的问题没有任何背景就直接跳到我的问题上;你是对的。我确实想模拟一个构造函数有参数的类。正如 Delphi-Mocks 项目中提供的示例显示 TesTObjectMock sample 一样,被测类 (TFoo) 作为通用参数传递,就像在 mock := TMock
.create 中一样。问题出在类函数“Create”中,它调用了“Invoke”。 -
您可以亲眼看到
TMock<TFoo>.Create导致调用TFoo.Create。所以我得出的结论是,您应该使用抽象基类,在这种情况下,您不需要构造函数上的参数,因为您从未实例化该基类。 -
@DavidHeffernan,模拟的目的是让某些东西看起来像被测类 (CUT),但允许您(测试的编写者)完全控制 CUT 可以访问的值或在调用测试时“查看”。 Delphi-Mocks 特别利用了 D2010(?) TVirtualMethodInterceptor 中引入的 RTTI 方法类,并且(据我理解)字面上“拦截”(或提供挂钩)所有虚拟方法。所以我假设当调用 ctor.Invoke 时,实际的类是以某种方式实例化的......?实例化会很糟糕。
标签: delphi mocking delphi-mocks