Delphi 模拟 - 验证重载方法从未被调用
Delphi Mocks - Verify an overloaded method is never called
如标题所示,我正在尝试编写一个测试来验证是否调用了方法的一个版本,而未调用重载版本。由于 Delphi-Mocks 似乎在参数匹配上使用索引,我看到了一个失败,并且重载函数被调用时实际上不是。
示例测试界面
TFoo = class(TObject)
public
function Bar(const a, b, c: string) : string; overload;virtual;
function Bar(const a: string) : string; overload;virtual;
end;
示例测试代码
procedure TestClass.Test
var mock : TMock<TFoo>;
bar : TBar;
begin
mock := TMock<TFoo>.Create;
bar := TBar.Create(mock);
mock.Setup.Expect.Once.When.Bar('1','2','3');
mock.Setup.Expect.Never.When.Bar(It(0).IsAny<string>());
//Will Wind up down an if-branch calling either bar(1) or bar(3)
bar.Execute;
mock.VerifyAll;
end;
谢谢!
您可以使用“WillExecute”进行检查。例如:
procedure TestClass.Test;
var
mock : TMock<TFoo>;
bar : TBar;
CheckPassed: Boolean;
begin
mock := TMock<TFoo>.Create;
bar := TBar.Create(mock);
CheckPassed := True;
mock.Setup.WillExecute('Bar',
function(const Args: TArray<TValue>; const ReturnType: TRttiType): TValue
begin
if Length(Args) = 2 then // one is for "Self"
CheckPassed := False;
end);
//Will Wind up down an if-branch calling either bar(1) or bar(3)
bar.Execute;
Assert(CheckPassed);
end;
FWIW Spring Mocks(即将发布的 1.2 版本的一部分)相同的测试如下所示:
procedure TestClass.Test;
var
mock: Mock<TFoo>;
bar: TBar;
begin
foo := TBar.Create(mock);
bar.Execute;
mock.Received(1).Bar('1', '2', '3');
mock.Received(0).Bar(Arg.IsAny<string>);
end;
如您所见,这个概念有点不同。如果您是 运行 模拟行为动态(默认),则允许每次调用模拟,并且 returns 函数的默认值(如空字符串、0 或 nil)。之后您可以使用 Received 检查方法是否调用了预期的时间。
如标题所示,我正在尝试编写一个测试来验证是否调用了方法的一个版本,而未调用重载版本。由于 Delphi-Mocks 似乎在参数匹配上使用索引,我看到了一个失败,并且重载函数被调用时实际上不是。
示例测试界面
TFoo = class(TObject)
public
function Bar(const a, b, c: string) : string; overload;virtual;
function Bar(const a: string) : string; overload;virtual;
end;
示例测试代码
procedure TestClass.Test
var mock : TMock<TFoo>;
bar : TBar;
begin
mock := TMock<TFoo>.Create;
bar := TBar.Create(mock);
mock.Setup.Expect.Once.When.Bar('1','2','3');
mock.Setup.Expect.Never.When.Bar(It(0).IsAny<string>());
//Will Wind up down an if-branch calling either bar(1) or bar(3)
bar.Execute;
mock.VerifyAll;
end;
谢谢!
您可以使用“WillExecute”进行检查。例如:
procedure TestClass.Test;
var
mock : TMock<TFoo>;
bar : TBar;
CheckPassed: Boolean;
begin
mock := TMock<TFoo>.Create;
bar := TBar.Create(mock);
CheckPassed := True;
mock.Setup.WillExecute('Bar',
function(const Args: TArray<TValue>; const ReturnType: TRttiType): TValue
begin
if Length(Args) = 2 then // one is for "Self"
CheckPassed := False;
end);
//Will Wind up down an if-branch calling either bar(1) or bar(3)
bar.Execute;
Assert(CheckPassed);
end;
FWIW Spring Mocks(即将发布的 1.2 版本的一部分)相同的测试如下所示:
procedure TestClass.Test;
var
mock: Mock<TFoo>;
bar: TBar;
begin
foo := TBar.Create(mock);
bar.Execute;
mock.Received(1).Bar('1', '2', '3');
mock.Received(0).Bar(Arg.IsAny<string>);
end;
如您所见,这个概念有点不同。如果您是 运行 模拟行为动态(默认),则允许每次调用模拟,并且 returns 函数的默认值(如空字符串、0 或 nil)。之后您可以使用 Received 检查方法是否调用了预期的时间。