Col*_*inM 2 delphi unit-testing dunitx delphi-10-seattle
我的问题与此类似,但我想传递一个整数数组,而不是一个集合。
例如:
[TestCase('TestAdd','[1,2,3,4];[1,2,3,4]',';')]
procedure TestAdd(aValue, aResult: array of integer);
Run Code Online (Sandbox Code Playgroud)
修改DUnitX.Utils似乎是最干净的方法,但是我不确定如何进行转换。我的主要问题是,它将如何知道我特别需要一个整数数组?我可以利用PTypeInfo中的某些东西吗?
您不能使用开放数组,因为RTTI缺少代码来调用带有此类参数的方法(实际上是由内部的两个参数实现的)。因此,您需要更改要使用的签名TArray<T>或任何其他动态数组类型。
然后,对DUnitX.Utils的修改就非常容易-只需将此函数添加到tkUString-> tkDynArray的Conversions数组中(任何可能的优化作为练习供读者使用):
function ConvStr2DynArray(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
var
s: string;
values: TStringDynArray;
i: Integer;
p: Pointer;
v1, v2: TValue;
elType: PTypeInfo;
begin
s := ASource.AsString;
if StartsStr('[', s) and EndsStr(']', s) then
s := Copy(s, 2, Length(s) - 2);
values := SplitString(s, ',');
i := Length(values);
p := nil;
DynArraySetLength(p, ATarget, 1, @i);
TValue.MakeWithoutCopy(@p, ATarget, AResult);
elType := ATarget.TypeData.DynArrElType^;
for i := 0 to High(values) do
begin
v1 := TValue.FromString(values[i]);
if not v1.TryConvert(elType, v2) then
Exit(False);
AResult.SetArrayElement(i, v2);
end;
Result := True;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |