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, чтобы проверить, вызывали ли методы ожидаемое время.