Delphi模拟 - 验证永远不会调用重载方法

时间:2016-04-05 20:16:58

标签: delphi delphi-mocks

正如标题所示,我正在尝试编写一个测试来验证方法的一个版本是否被调用,而重载的版本则没有。由于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;

谢谢!

2 个答案:

答案 0 :(得分:2)

Spring Mocks中的FWIW(即将发布的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;

你注意到这个概念有点不同。如果运行模拟行为动态(默认情况下),则允许每次调用mock并返回函数的默认值(如空字符串,0或nil)。之后,您可以使用Received来检查调用预期时间的方法。

答案 1 :(得分:1)

你可以使用&#34; WillExecute&#34;检查这个。例如:

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;