2014-03-25 12 views
5

Ich arbeite durch das Coding Delphi Buch, und ich habe Probleme mit Delphi Mocks. Wenn ich das Mock mit dem Attribut [Setup] mit DUnitX erstelle, scheint es, als würde es nie erstellt. Wenn ich das Mock innerhalb des Tests selbst erstelle, funktioniert es richtig. Ich dachte, Setup und TearDown sollten so eingerichtet sein, dass Sie nicht für jeden Test dieselben Elemente erstellen müssen.Delphi Mocks mit DUnitX Setup und TearDown

Unten ist der Code für das Gerät zu testen

unit uDollarToGalleonsConverterTest; 

interface 

uses 
    uDollarToGalleonsConverter, 
    Spring.Services.Logging, 
    Delphi.Mocks, 
    DUnitX.TestFramework; 


type 

    [TestFixture] 
    TDollarToGalleonConverterTest = class 
    private 
    Expected, Actual: Double; 
    Converter: TDollarsToGalleonsConverter; 
    Logger: ILogger; 
    [Setup] 
    procedure Setup; 
    [TearDown] 
    procedure TearDown; 
    public 
    [Test] 
    procedure TestPointFiveCutsDollarsInHalf; 
    end; 


implementation 

{ TDollarToGalleonConverterTest } 

procedure TDollarToGalleonConverterTest.Setup; 
begin 
    Logger := TMock<ILogger>.Create; 
    Converter := TDollarsToGalleonsConverter.Create(Logger); 
end; 

procedure TDollarToGalleonConverterTest.TearDown; 
begin 
    Converter.Free; 
end; 

procedure TDollarToGalleonConverterTest.TestPointFiveCutsDollarsInHalf; 
begin 
    Expected := 1.0; 

    Actual := Converter.ConvertDollarsToGalleons(2, 0.5); 

    Assert.AreEqual(Expected, Actual, 
    'Converter failed to convert 2 dollars to 1 galleon'); 
end; 

initialization 
    TDUnitX.RegisterTestFixture(TDollarToGalleonConverterTest); 

end. 
+0

Wenn es einen Fehler in meinem Buch gibt, würde ich gerne darüber auf [email protected] wissen. –

+0

Ich glaube nicht, dass es ein Fehler in Ihrem Buch ist, eher ein Missverständnis meinerseits. Ich versuche, einen Schein in der Setup-Prozedur des DUnitX-Tests zu erstellen. Es funktioniert gut, wenn ich das Mock innerhalb des Tests selbst, wie Sie in dem Buch, erstellen, aber wenn ich versuche, die Erstellung im Setup zu tun, dann löst es Ausnahmen aus, weil das Mock nie erstellt wird. – TheEndIsNear

Antwort

1

Ja, ein Konflikt zwischen dem Buch zu sein scheint und Wirklichkeit:

Versuchen Sie zugeschrieben Methoden auf den öffentlichen Bereich zu bewegen.

+0

Ich habe die Methoden in den öffentlichen Bereich verschoben, aber ich bekomme immer noch eine Ausnahme vom Mock, die nicht erstellt wird. – TheEndIsNear

+0

Ich bin dann ratlos. Grundsätzlich mache ich das, was Sie hier mit XE5 machen, ohne Probleme, außer dass ich noch keinen Mock benutze. Wird Setup überhaupt nicht getroffen? –

+0

Wenn ich das gleiche Setup für Tests ohne einen Schein ausführen, funktioniert es ordnungsgemäß als eine private Methode. Aber wenn ich einmal versucht habe, den Mock zu benutzen, erzeugt es nicht den Mock. – TheEndIsNear

5

Standardmäßig wird Rtti für Methoden für öffentliche und veröffentlichte Methoden generiert. Wenn Sie private oder geschützte Methoden haben, wird das Framework diese nicht finden, selbst wenn sie die Attribute haben.

So wird Ihre Setup-Methode nie aufgerufen werden.

1

Ich weiß, das ist ein alter Beitrag, aber immer noch eine Antwort wert.

Das Problem ist, dass TMock ein Datensatz ist, und Sie haben keine Variable, um es zu halten. Ändern Sie Logger zu TMock und es sollte gut funktionieren.

Bearbeiten: Vergessen zu erwähnen, TMock hat einen impliziten Operator, der ILogger implementiert, so dass Sie Logger weiterhin verwenden können, wo ein ILogger benötigt wird.

Verwandte Themen