![]() |
DUnitX und Arrays
moinmoin,
da ich recht neu bin in Sachen Unittests, hab ich einfach mal ein wenig rumgespielt damit. Dabei bin ich auf folgendes Problem gestoßen:
Delphi-Quellcode:
Das is der zu testende Code. Soweit nix komplexes.
Type
TCalcUnits = (cuHl,cuLiter,cuDez,cMil); TResultArray = array[TCalcUnit] of Int64; function CalcUnits(avalue:int64):TResultArray;
Delphi-Quellcode:
Der Testcode dazu, wie ich dachte, das es funktionieren sollte. Was es aber nicht tut.
:
[Test] [TestCase('Test 1','1234;[1,2,3,4]',';')] [TestCase('Test 1','7832;[7,8,3,2]',';')] Procedure TestCalcUnits(const avalue:int64;expected:TResultArray); : Procedure TestClass.TestCalcUnits(const avalue:int64;expected:TResultArray); var realResult : TResultArray; begin realResult := CalcUnits(avalue); Assert.AreEqual(expected,realResult,'passed'); end; expected ist immer (0,0,0,0). Ändere ich expected auf const/var schreit er, das die parameter vom gleichen Type sein müssen. Wie muss ich das angeben, das er expected korrekt befüllt ? |
AW: DUnitX und Arrays
Ein "Workaround" wäre doch zunächst die ganz normal einen eigenen Test für diese exakten Ein- und Ausgaben zu machen, oder? Ich persönlich fände das auch übersichtlicher, vielleicht auch nur weil ich DUnitX nicht gewohnt bin und es weiterhin "klassisch" mit DUnit mache.
Siehe auch: ![]() und ![]() Anscheinend müsste man in
Delphi-Quellcode:
die vorgefertigen Konvertierungen anpassen, denn zumindest das [0,0,0,0] kann ich nachvollziehen, das statische Array scheint er nicht auflösen zu können.
DUnitX.Utils
|
AW: DUnitX und Arrays
Wird derzeit nicht unterstützt, kannst du aber einfach einbauen - gehe dazu in die DUnitX.Utils unit und füge diese Routine hinzu:
Delphi-Quellcode:
Außerdem musst du sie noch in das Conversions Array bei [tkUString,tkArray] eintragen.
function ConvStr2Arr(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
var lValue: string; lValues: TStringDynArray; lArrayData: TArrayTypeData; elType: PTypeInfo; tmp: TValue; i: Integer; begin lValue := ASource.AsString; if Length(lValue) < 2 then Exit(False); if (lValue[1] <> '[') or (lValue[Length(lValue)] <> ']') then Exit(False); lValue := Copy(lValue, 2, Length(lValue) - 2); lValues := SplitString(lValue, ','); // todo: support multi dim arrays - assume one dim for now lArrayData := GetTypeData(ATarget).ArrayData; elType := lArrayData.ElType^; if Length(lValues) <> lArrayData.ElCount then Exit(False); TValue.Make(nil, ATarget, AResult); for i := 0 to lArrayData.ElCount - 1 do begin if not TValue.From(lValues[i]).TryConvert(elType, tmp) then Exit(False); AResult.SetArrayElement(i, tmp); end; Result := True; end; P.S. Dann klappt das übrigens auch mit dem const. |
AW: DUnitX und Arrays
Danke Stevie, hat geklappt :):thumb::thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz