Delphi DSharp Mock 抛出意外调用错误 - 为什么?
Delphi DSharp Mock is throwing an Unexpected Invocation error - why?
在使用 DSharp Mock 的 Delphi DUnit 测试中使用记录类型作为接口时,它抛出异常调用,但我不明白为什么?我在下面创建了测试控制台应用程序。
program ConsoleStuff;
{$APPTYPE CONSOLE}
{$R *.res}
uses
DSharp.Testing.Mock,
DUnitTestRunner,
Spring,
TestFramework,
System.SysUtils;
type
{$M+}
IMyType = interface
['{D3F69229-1B46-4FE2-B078-80AA313FB601}']
function GetNullableSingle: Nullable<Single>;
function GetSingleValue: Single;
procedure SetNullableSingle(const Value: Nullable<Single>);
procedure SetSingleValue(const Value: Single);
property NullableSingle: Nullable<Single> read GetNullableSingle write SetNullableSingle;
property SingleValue: Single read GetSingleValue write SetSingleValue;
end;
TMyType = class(TInterfacedObject, IMyType)
private
FNullableSingle: Nullable<Single>;
FSingleValue: Single;
function GetNullableSingle: Nullable<Single>;
function GetSingleValue: Single;
procedure SetNullableSingle(const Value: Nullable<Single>);
procedure SetSingleValue(const Value: Single);
public
property NullableSingle: Nullable<Single> read GetNullableSingle write SetNullableSingle;
end;
TMyOtherType = class
private
FMyType: IMyType;
public
constructor Create(const AMyType: IMyType);
procedure SetMyTypeValue(const AValue: Nullable<Single>);
end;
TMyOtherTypeTests = class( TTestCase)
published
procedure UnexpectedInvocation;
end;
{ TMyType }
function TMyType.GetNullableSingle: Nullable<Single>;
begin
Result := FNullableSingle;
end;
function TMyType.GetSingleValue: Single;
begin
Result := FSingleValue;
end;
procedure TMyType.SetNullableSingle(const Value: Nullable<Single>);
begin
FNullableSingle := Value;
end;
procedure TMyType.SetSingleValue(const Value: Single);
begin
FSingleValue := Value;
end;
{ TMyOtherType }
constructor TMyOtherType.Create(const AMyType: IMyType);
begin
FMyType := AMyType;
end;
procedure TMyOtherType.SetMyTypeValue(const AValue: Nullable<Single>);
begin
FMyType.SetSingleValue(AValue.Value); // This works OK
FMyType.SetNullableSingle(AValue); // This DOES NOT work
end;
{ TMyOtherTypeTests }
procedure TMyOtherTypeTests.UnexpectedInvocation;
var
LMyOtherType: TMyOtherType;
LMyType: Mock<IMyType>;
begin
LMyType.Setup.WillExecute.Once.WhenCalling.SetSingleValue(Nullable<Single>.Create(10)); // This is OK
LMyType.Setup.WillExecute.Once.WhenCalling.SetNullableSingle(Nullable<Single>.Create(10)); // This is NOT OK
//LMyType.Setup.WillExecute.Once.WhenCallingWithAnyArguments.SetNullableSingle(Nullable<Single>.Create(10)); // This line WORKS OK
LMyOtherType := TMyOtherType.Create(LMyType);
LMyOtherType.SetMyTypeValue(Nullable<Single>.Create(10));
LMyType.Verify;
end;
begin
try
RegisterTests('TMyOtherType', [TMyOtherTypeTests.Suite]);
DUnitTestRunner.RunRegisteredTests;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
使用“WhenCallingWithAnyArguments”方法测试工作正常,但我确实需要“WhenCalling”方法来检查分配给 属性 setter.
的值
我使用 Nullable<> 类型仅用于演示目的,其他 Record 类型也失败。
请帮忙!
DSharp Mocks 不支持所有类型的参数匹配(参见 DSharp.Core.Reflection
中的 SameValue
)。
您当然可以解决这个问题,但我建议您迁移到 Spring.Mocking
,它的 API 略有不同,但为所有类型提供参数匹配,并且功能更强大。
在使用 DSharp Mock 的 Delphi DUnit 测试中使用记录类型作为接口时,它抛出异常调用,但我不明白为什么?我在下面创建了测试控制台应用程序。
program ConsoleStuff;
{$APPTYPE CONSOLE}
{$R *.res}
uses
DSharp.Testing.Mock,
DUnitTestRunner,
Spring,
TestFramework,
System.SysUtils;
type
{$M+}
IMyType = interface
['{D3F69229-1B46-4FE2-B078-80AA313FB601}']
function GetNullableSingle: Nullable<Single>;
function GetSingleValue: Single;
procedure SetNullableSingle(const Value: Nullable<Single>);
procedure SetSingleValue(const Value: Single);
property NullableSingle: Nullable<Single> read GetNullableSingle write SetNullableSingle;
property SingleValue: Single read GetSingleValue write SetSingleValue;
end;
TMyType = class(TInterfacedObject, IMyType)
private
FNullableSingle: Nullable<Single>;
FSingleValue: Single;
function GetNullableSingle: Nullable<Single>;
function GetSingleValue: Single;
procedure SetNullableSingle(const Value: Nullable<Single>);
procedure SetSingleValue(const Value: Single);
public
property NullableSingle: Nullable<Single> read GetNullableSingle write SetNullableSingle;
end;
TMyOtherType = class
private
FMyType: IMyType;
public
constructor Create(const AMyType: IMyType);
procedure SetMyTypeValue(const AValue: Nullable<Single>);
end;
TMyOtherTypeTests = class( TTestCase)
published
procedure UnexpectedInvocation;
end;
{ TMyType }
function TMyType.GetNullableSingle: Nullable<Single>;
begin
Result := FNullableSingle;
end;
function TMyType.GetSingleValue: Single;
begin
Result := FSingleValue;
end;
procedure TMyType.SetNullableSingle(const Value: Nullable<Single>);
begin
FNullableSingle := Value;
end;
procedure TMyType.SetSingleValue(const Value: Single);
begin
FSingleValue := Value;
end;
{ TMyOtherType }
constructor TMyOtherType.Create(const AMyType: IMyType);
begin
FMyType := AMyType;
end;
procedure TMyOtherType.SetMyTypeValue(const AValue: Nullable<Single>);
begin
FMyType.SetSingleValue(AValue.Value); // This works OK
FMyType.SetNullableSingle(AValue); // This DOES NOT work
end;
{ TMyOtherTypeTests }
procedure TMyOtherTypeTests.UnexpectedInvocation;
var
LMyOtherType: TMyOtherType;
LMyType: Mock<IMyType>;
begin
LMyType.Setup.WillExecute.Once.WhenCalling.SetSingleValue(Nullable<Single>.Create(10)); // This is OK
LMyType.Setup.WillExecute.Once.WhenCalling.SetNullableSingle(Nullable<Single>.Create(10)); // This is NOT OK
//LMyType.Setup.WillExecute.Once.WhenCallingWithAnyArguments.SetNullableSingle(Nullable<Single>.Create(10)); // This line WORKS OK
LMyOtherType := TMyOtherType.Create(LMyType);
LMyOtherType.SetMyTypeValue(Nullable<Single>.Create(10));
LMyType.Verify;
end;
begin
try
RegisterTests('TMyOtherType', [TMyOtherTypeTests.Suite]);
DUnitTestRunner.RunRegisteredTests;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
使用“WhenCallingWithAnyArguments”方法测试工作正常,但我确实需要“WhenCalling”方法来检查分配给 属性 setter.
的值我使用 Nullable<> 类型仅用于演示目的,其他 Record 类型也失败。
请帮忙!
DSharp Mocks 不支持所有类型的参数匹配(参见 DSharp.Core.Reflection
中的 SameValue
)。
您当然可以解决这个问题,但我建议您迁移到 Spring.Mocking
,它的 API 略有不同,但为所有类型提供参数匹配,并且功能更强大。