delphi 分配接口时出现Spring4D Mock错误

pkln4tw6  于 2023-06-22  发布在  Spring
关注(0)|答案(1)|浏览(133)

通过这些声明:

type
  IMyIfc = interface(IInvokable)
    ['{11D3AAF1-7A3E-45CA-9FB4-090010A29FC5}']
    function Test: integer;
  end;

  IMySecondIfc = interface(IInvokable)
    ['{3360E5DB-6EDD-4F6E-A8C5-B2FB0ED7C0CD}']
    function GetTestProp: IMyIfc;
    procedure SetTestProp(const Value: IMyIfc);
    property TestProp: IMyIfc read GetTestProp write SetTestProp;
  end;

我尝试了以下操作,在标记的行上出错:

var
    myIfcMock: Mock<IMyIfc>;
    mySecondIfcMock: Mock<IMySecondIfc>;
    mySecondIfc: IMySecondIfc;
    testIfc: IMyIfc;

  myIfcMock.Setup.Returns(5).When.Test;
  mySecondIfcMock.Setup.Returns(myIfcMock).When.TestProp;
  mySecondIfc := mySecondIfcMock;
  testIfc := mySecondIfc.TestProp; // EConvertError with message 'Mock<Unit1.IMyIfc> cannot be converted to IMyIfc'
  ShowMessage(testIfc.Test.ToString);

这看起来很奇怪,因为mock在某种程度上实现了接口。我也找不到解决这个问题的办法。我会感激你的任何提示。

olmpazwi

olmpazwi1#

这是在这一行使用类型推断的结果:

mySecondIfcMock.Setup.Returns(myIfcMock).When.TestProp;

编译器实际上将其解释为:

mySecondIfcMock.Setup.Returns<Mock<IMyIfc>>(myIfcMock).When.TestProp;

尽管你的意思是

mySecondIfcMock.Setup.Returns<IMyIfc>(myIfcMock).When.TestProp;

当使用1.2时,这实际上是您需要编写的类型转换(事实上,没有,因为类型已经匹配)。
在2.0(development)中,Mock<T>-> T的转换已经实现,所以你可以在那里使用类型推断。

相关问题