Unit testing Delphi-测试是否将事件分配给方法,但不覆盖每种委托类型

Unit testing Delphi-测试是否将事件分配给方法,但不覆盖每种委托类型,unit-testing,delphi,generics,Unit Testing,Delphi,Generics,我必须在Delphi中对一些表单进行单元测试。我的老板要我写测试来检查是否分配了事件。太多了,我们得检查一下 例如,我想检查一下 TMyForm.OnCreate = TMyForm.FormCreate. 为此,我写道: function TFMaitreTest.SameMethod(const Method1, Method2: TNotifyEvent; msg : string = ''): boolean; begin Assert.IsTrue(TEqualityComparer

我必须在Delphi中对一些表单进行单元测试。我的老板要我写测试来检查是否分配了事件。太多了,我们得检查一下

例如,我想检查一下

TMyForm.OnCreate = TMyForm.FormCreate.
为此,我写道:

function TFMaitreTest.SameMethod(const Method1, Method2: TNotifyEvent; msg : string = ''): boolean;
begin
Assert.IsTrue(TEqualityComparer<TNotifyEvent>.Default.Equals(Method1, Method2), msg);
end;
但这并不适用于编译。TEqualityComparer需要一些泛型约束,但无法为对象的过程定义泛型约束。使用TMethod作为约束也不起作用。也许有办法,但我还没找到

然后,我考虑使用Rtti完全改变方法。我想比较使用Rtti的方法,但为此,我必须知道带有字符串的方法的名称

RttiType.GetMethod(methodName)
这里,methodName是一个纯字符串。如果我们重构,methodName变成了MyMethod,我们就有点麻烦了,必须在使用这个字符串的任何地方手动检查。我们希望有编译时错误。它不太容易出错

C具有lambda表达式的概念,对于此类场景非常强大:

如果一个事件属性被分配给一个特定的过程,我如何编写一种更通用的测试方法,而不必为每种事件类型编写一个方法


感谢您的帮助。

由于您使用的是DUnitX Assert类型,因此应使用其AreEqual方法,该方法完全符合您的要求-但您必须指定泛型类型参数,并且不能让编译器推断:

Assert.AreEqual<TNotifyEvent>(myForm.OnCreate, myForm.FormCreate);

由于您使用的是DUnitX Assert类型,因此应使用其AreEqual方法,该方法完全符合您的要求-但您必须指定泛型类型参数,并且不能让编译器推断:

Assert.AreEqual<TNotifyEvent>(myForm.OnCreate, myForm.FormCreate);

我假设您正在使用DUnitX,因为我发现了Assert.IsTrue的用法。那么,Assert.AreEqual不就是你想要的吗?@StefanGlienke完全忽略了这个简单的解决方案。我很快地测试了它,我认为它成功了。请写下这个作为回答,这样我就可以接受了。我假设您正在使用DUnitX,因为我发现了Assert.IsTrue的用法。那么,Assert.AreEqual不就是你想要的吗?@StefanGlienke完全忽略了这个简单的解决方案。我很快地测试了它,我认为它成功了。请将此作为回答,以便我可以接受。另一种方法是,不必使用泛型,使用RTTI检索分配给对象事件的当前值,然后如果该值分配给方法类型,则将该值转换为TMethod,并检查其代码字段是否为nil,然后使用RTTI检索方法的名称,并检查该名称是否与所需的方法相同,还检查TMethod.Data字段是否指向所需的对象。另一种方法是,不必使用泛型,使用RTTI检索分配给对象事件的当前值,然后,如果将该值分配给某个方法类型,则将该值强制转换为TMethod,并检查其代码字段是否为nil,然后使用RTTI检索该方法的名称,并检查该名称是否与所需方法相同,同时检查TMethod.Data字段是否指向所需对象。