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 ответа

Решение

Вы можете использовать "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;

Как вы заметили, концепция немного отличается. Если вы работаете с динамическим поведением макета (которое используется по умолчанию), то каждый вызов макета разрешен и возвращает значение по умолчанию для функций (например, пустую строку, 0 или ноль). После этого вы можете использовать Received, чтобы проверить, вызывали ли методы ожидаемое время.

Другие вопросы по тегам