【问题标题】:Delphi Spring Mock of reference to functionDelphi Spring Mock 对函数的引用
【发布时间】:2021-07-03 08:11:28
【问题描述】:

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

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&lt;T&gt; 语法传递一个作为回调的参数?

感谢并保持健康

【问题讨论】:

    标签: delphi mocking spring4d


    【解决方案1】:

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

    var
      f: TRefFunc;
    begin
      f := Arg.IsAny<TRefFunc>; // boom, E2010
    

    这是 Delphi 在调用时需要 () 以了解您实际上想要调用 rhs 并分配其结果的少数情况之一。

    【讨论】:

    • 感谢您的快速回复。在Arg.IsAny&lt;TRefFunc&gt; 之后添加() 让Delphi 很高兴。备注:您在ArgIsAny 之间的示例中忘记了.
    • 不明白你的意思 0;) 谢谢,已修复
    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多