Delphi Spring Mock 对函数的引用

标签 delphi mocking spring4d

我有一个接口(interface),我想用一个引用函数的参数来模拟这个接口(interface)的函数。见代码示例:

unit Main;

interface

procedure Execute;

implementation

uses
  Spring.Mocking;

type
  TRefFunc = reference to function: Boolean;

  IHelper = interface
  ['{7950E166-1C93-47E4-8575-6B2CCEE05304}']
  end;

  IIntfToMock = interface
  ['{8D85A1CD-51E6-4135-B0E9-3E732400BA25}']
    function DoSth(const AHelper: IHelper; const ARef: TRefFunc): Boolean;
  end;

procedure Execute;
var
  IntfMock : Mock<IIntfToMock>;
begin
  IntfMock := Mock<IIntfToMock>.Create();
  IntfMock.Setup.Returns(True).When.DoSth(Arg.IsAny<IHelper>, Arg.IsAny<TRefFunc>);
end;

end.
不幸的是,我收到一个编译错误:
[dcc32 Error] Main.pas(29): E2010 incompatible types: 'TRefFunc' and 'Spring.Mocking.Matching.TArg.IsAny<Main.TRefFunc>'
我理解为什么将回调作为参数传递给模拟方法不是一个好主意,如果该方法将被模拟。最好的解决方案是重构代码并从方法中删除回调参数。但我想知道是否可以通过 Arg.IsAny<T> 传递一个作为回调的参数。句法?
感谢并保持健康

最佳答案

当将可调用的东西传递给函数引用参数时,编译器会尝试在其上构建闭包,然后将其传递给参数。变量也会发生这种情况:

var
  f: TRefFunc;
begin
  f := Arg.IsAny<TRefFunc>; // boom, E2010
这是 Delphi 需要 () 的少数情况之一。在通话中了解您实际上想要调用 rhs 并分配其结果。

关于Delphi Spring Mock 对函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66987349/

相关文章:

delphi - 使用 Spring4D 进行构造函数注入(inject)时出现 "Unsatisfied constructor"

windows - 如何在拥有句柄时检查给定进程是否正在运行

delphi - Delphi中如何关闭非模态窗体

java - RESTEasy Mock 对比异常映射器对比上下文

c# - DotNetOpenAuth:模拟 ClaimsResponse

Delphi SysUtils.Supports 意外返回 true

delphi - Spring 框架中是否有内置的方法可以使多态容器的使用变得更容易?

delphi - PNG组件 : how to add PNG file to TPngImageList

delphi - GDI+ DrawLine 什么都不画

javascript - 在函数内模拟函数并以 Jest 的方式获取调用计数