我在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。 谢谢。 瑞克。
答案 0 :(得分:2)
在错误日志中回答。具有指定值的枚举没有RTTI。如果你想要带有rtti和具体值的枚举,你必须使用虚拟的emeration条目,比如 TBadEnum =(badDummy0,badEnum1,badEnum2,badDummy3,badEnum4);
其他选项是使用某种整数类型