Delphi Spring 模拟函数引用
Delphi Spring Mock of reference to function
我有一个接口,我想用一个参数模拟这个接口的函数,该参数是对函数的引用。见代码示例:
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 并分配其结果的少数情况之一。
我有一个接口,我想用一个参数模拟这个接口的函数,该参数是对函数的引用。见代码示例:
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 并分配其结果的少数情况之一。