gpt4 book ai didi

Delphi 模拟可空类型

转载 作者:行者123 更新时间:2023-12-03 15:45:00 27 4
gpt4 key购买 nike

使用 Spring 框架中的 Nullable 类型设置 Delphi DSharp 模拟的最佳方法是什么?我尝试了各种方法,我知道我可能错过了一些非常基本的东西,但我只是不知道如何让以下代码工作:

program DSharkMockNullable;

{$APPTYPE CONSOLE}

{$R *.res}

uses
DSharp.Testing.Mock,
Spring,
System.SysUtils;

type

{$M+}
IBaseMock = interface
['{B3311345-3C1F-47E3-8235-57B1BA04E957}']
function GetId: TNullableInteger;
procedure SetId(Value: TNullableInteger);
property Id: TNullableInteger read GetId write SetId;
end;

{$M+}
IMockMe = interface(IBaseMock)
['{07F8F233-E8F5-4743-88C5-97A66BB01E29}']
function GetObjectId: TNullableInteger;
procedure SetObjectId(Value: TNullableInteger);
property ObjectId: TNullableInteger read GetObjectId write SetObjectId;
function GetObjectName: TNullableString;
procedure SetObjectName(Value: TNullableString);
property ObjectName: TNullableString read GetObjectName write SetObjectName;
end;

TMyObject = class
public
function ObjectIdAsString(const AObject: IMockMe): string;
end;


{ TMyObject }

function TMyObject.ObjectIdAsString(const AObject: IMockMe): string;
var
LId: Integer;
LObjectId: Integer;
LObjectName: string;
begin
LId := AObject.Id; // ***** FAILS HERE with an "Invalid Typecast" error
LObjectId := AObject.ObjectId;
LObjectName := AObject.ObjectName;
Result := Format('Id: %d', [LId]);
Result := Format('Object Id: %d', [LObjectId]);
Result := Format('Object Name: %s', [LObjectName]);
end;

var
LMock: Mock<IMockMe>;
LObject: TMyObject;
begin
try
LMock.Setup.WillReturn(123).Any.WhenCalling.Id;
LMock.Setup.WillReturn(456).Any.WhenCalling.ObjectId;
LMock.Setup.WillReturn('blahblah').Any.WhenCalling.ObjectName;

LObject := TMyObject.Create;
Writeln(LObject.ObjectIdAsString(LMock.Instance));
LObject.Free;

Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

有什么好的想法或建议吗?我使用的是德尔福XE5。谢谢。瑞克。

最佳答案

正确的代码应如下所示(不使用类型推断):

LMock.Setup.WillReturn<TNullableInteger>(123).Any.WhenCalling.Id;
LMock.Setup.WillReturn<TNullableInteger>(456).Any.WhenCalling.ObjectId;
LMock.Setup.WillReturn<TNullableString>('blahblah').Any.WhenCalling.ObjectName;

作为正确答案的补充,里克已经在这里给出了一些解释为什么会出现这种情况:

原始代码对传递给 WillReturn 的值使用类型推断,并将它们推断为 ShortIntSmallInt (编译器使用适合的最小有符号序数类型)和 string 。它们存储为 TValue 并在调用方法时返回。但随后 RTTI 尝试将 TValue 转换为返回类型和失败的方法,因为它不知道如何将 ShortIntSmallInt 转换为 Nullable<Integer> 或将 string 转换为 Nullable<string>,因为 TValue.TryCast 不知道任何隐式运算符重载Nullable<> 类型,无法注册任何自定义转换器。

关于Delphi 模拟可空类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23988175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com