首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有可空类型的Delphi模拟

带有可空类型的Delphi模拟
EN

Stack Overflow用户
提问于 2014-06-02 06:02:02
回答 2查看 756关注 0票数 3

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

代码语言:javascript
运行
复制
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。谢谢。瑞克。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-02 06:22:11

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

代码语言:javascript
运行
复制
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的值使用类型推断,并将它们推断为ShortIntSmallInt (编译器使用适合的最小符号序号类型)和string。它们作为TValue存储,并在调用方法时返回。但是,RTTI尝试将TValue转换为返回类型,方法失败,因为它不知道如何将ShortIntSmallInt转换为Nullable<Integer>,也不知道如何将string转换为Nullable<string>,因为TValue.TryCast不知道Nullable<>类型的任何隐式运算符重载,并且无法注册任何自定义转换器。

票数 6
EN

Stack Overflow用户

发布于 2014-06-02 06:07:39

好吧,我应该读一读"DSharp for Dummies“,但如果其他人遇到麻烦,答案是:

代码语言:javascript
运行
复制
LMock.Setup.WillReturn<TNullableInteger>(123).Any.WhenCalling.Id;
LMock.Setup.WillReturn<TNullableInteger>(456).Any.WhenCalling.ObjectId;
LMock.Setup.WillReturn<TNullableString>('blahblah').Any.WhenCalling.ObjectName;

我希望这能帮到其他人;-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23988175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档