2016-04-05 1 views
2

Как следует из названия, я пытаюсь написать тест, чтобы проверить, что вызывается одна версия метода, а перегруженная версия - нет. Поскольку Delphi-Mocks, по-видимому, использует индексирование при сопоставлении параметров, я вижу неудачу и что перегруженная функция вызывается, когда она на самом деле, а не.Delphi Mocks - проверка перегруженного метода никогда не называется

Sample Test Interface

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; 

Спасибо!

ответ

1

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

Это решение, в котором я закончил использовать. Это была именно та часть, которую мне не хватало. – mwilkinson

2

FWIW весной 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, чтобы проверить, были ли методы, которые вызывают ожидаемые времена.