2016-04-05 5 views
2

Wie der Titel vorschlägt, versuche ich einen Test zu schreiben, um zu überprüfen, dass eine Version einer Methode aufgerufen wird, und dass die überladene Version nicht ist. Da Delphi-Mocks bei der Parameterübereinstimmung Indizierung zu verwenden scheint, sehe ich einen Fehler, und dass die überladene Funktion aufgerufen wird, obwohl sie tatsächlich nicht aktiv ist.Delphi Mocks - Überprüfen Sie, dass eine überladene Methode nie aufgerufen wird

Beispiel Test Schnittstelle

TFoo = class(TObject) 
public 
    function Bar(const a, b, c: string) : string; overload;virtual; 
    function Bar(const a: string) : string; overload;virtual; 
end; 

Beispieltestcode

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; 

Dank!

Antwort

1

Sie können "WillExecute" verwenden, um dies zu überprüfen. Zum Beispiel:

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

Dies ist die Lösung, die ich am Ende verwendet habe. Es war genau das Stück, das ich vermisste. – mwilkinson

2

FWIW im Frühjahr Mocks (Teil der kommenden Version 1.2) der gleiche Test würde wie folgt aussehen:

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; 

Wie Sie das Konzept bemerken ein bisschen anders ist. Wenn Sie mit der Mock-Verhaltensdynamik arbeiten (was der Standardwert ist), ist jeder Aufruf des Mocks erlaubt und gibt den Standard für Funktionen zurück (wie leere Zeichenfolge, 0 oder Nil). Danach können Sie Received verwenden, um zu prüfen, ob die Methoden die erwarteten Zeiten genannt haben.

Verwandte Themen