使用DSharp的Delphi模拟器不会使用枚举器值进行编译

时间:2014-05-29 04:14:28

标签: delphi mocking

我在Delphi XE5中使用DSharp模拟(感谢Stefan !!)但是 某些 枚举器存在问题。如果我尝试定义具有特定值的枚举器,{$ M +}指令会导致以下错误:

E2134 Type 'TMyEnum' has no type info

以下是一个示例控制台应用程序,它总结了所有内容:

程序DSharpMockEnum;

program DSharpMockEnum;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  DSharp.Testing.Mock,
  System.SysUtils;

type

  TBadEnum = (badEnum1 = 1, badEnum2); // <---- WONT COMPILE
  TGoodEnum = (goodEnum1, goodEnum2); // This compiles OK

  {$M+}
  IBadMock = interface
  ['{34B3904E-3EBA-4C6E-BBA8-A40A67A32E7F}']
    function GetEnum: TBadEnum;
    procedure SetEnum(Value: TBadEnum);
    property MyEnum: TBadEnum read GetEnum write SetEnum;
  end;

  {$M+}
  IGoodMock = interface
  ['{34B3904E-3EBA-4C6E-BBA8-A40A67A32E7F}']
    function GetEnum: TGoodEnum;
    procedure SetEnum(Value: TGoodEnum);
    property MyEnum: TGoodEnum read GetEnum write SetEnum;
  end;

var
  LGoodMock: Mock<IGoodMock>;
  LBadMock: Mock<IBadMock>;
begin
  try
    Writeln('Good Mock');
    LGoodMock.Setup.WillReturn(goodEnum1).Any.WhenCalling.MyEnum;

    Writeln('Bad Mock');
    LBadMock.Setup.WillReturn(badEnum1).Any.WhenCalling.MyEnum;

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

有任何想法或建议吗?我宁愿避免重置我的所有枚举,因为有些存储在数据库中并需要特定的值。 德尔福XE5。 谢谢。 瑞克。

1 个答案:

答案 0 :(得分:2)

在错误日志中回答。具有指定值的枚举没有RTTI。如果你想要带有rtti和具体值的枚举,你必须使用虚拟的emeration条目,比如 TBadEnum =(badDummy0,badEnum1,badEnum2,badDummy3,badEnum4);

这里badDummy0有效存储0,badDummy3有效存储3

其他选项是使用某种整数类型