使用Spring框架中的Nullable类型设置Delphi模拟的最佳方法是什么?我尝试过各种方法,我知道我可能遗漏了一些非常基本的东西,但我不知道如何让下面的代码工作:
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。谢谢。瑞克。
发布于 2014-06-02 06:22:11
正确的代码应该如下所示(不使用类型推断):
LMock.Setup.WillReturn<TNullableInteger>(123).Any.WhenCalling.Id;
LMock.Setup.WillReturn<TNullableInteger>(456).Any.WhenCalling.ObjectId;
LMock.Setup.WillReturn<TNullableString>('blahblah').Any.WhenCalling.ObjectName;除了Rick已经在这里给出的正确答案之外,还解释了为什么会这样:
原始代码对传递给WillReturn的值使用类型推断,并将它们推断为ShortInt、SmallInt (编译器使用适合的最小符号序号类型)和string。它们作为TValue存储,并在调用方法时返回。但是,RTTI尝试将TValue转换为返回类型,方法失败,因为它不知道如何将ShortInt或SmallInt转换为Nullable<Integer>,也不知道如何将string转换为Nullable<string>,因为TValue.TryCast不知道Nullable<>类型的任何隐式运算符重载,并且无法注册任何自定义转换器。
发布于 2014-06-02 06:07:39
好吧,我应该读一读"DSharp for Dummies“,但如果其他人遇到麻烦,答案是:
LMock.Setup.WillReturn<TNullableInteger>(123).Any.WhenCalling.Id;
LMock.Setup.WillReturn<TNullableInteger>(456).Any.WhenCalling.ObjectId;
LMock.Setup.WillReturn<TNullableString>('blahblah').Any.WhenCalling.ObjectName;我希望这能帮到其他人;-)
https://stackoverflow.com/questions/23988175
复制相似问题