Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 从字符串到整数数组的DUnitX转换_Unit Testing_Delphi_Delphi 10 Seattle_Dunitx - Fatal编程技术网

Unit testing 从字符串到整数数组的DUnitX转换

Unit testing 从字符串到整数数组的DUnitX转换,unit-testing,delphi,delphi-10-seattle,dunitx,Unit Testing,Delphi,Delphi 10 Seattle,Dunitx,我的问题类似于,但我想传递一个整数数组,而不是一个集合 每个示例: [TestCase('TestAdd','[1,2,3,4];[1,2,3,4]',';')] procedure TestAdd(aValue, aResult: array of integer); 修改DUnitX.Utils似乎是最干净的方法,但我不确定如何进行转换。我的主要问题是,它如何知道我特别需要一个整数数组?PTypeInfo中有什么我可以利用的吗 您不能使用开放数组,因为RTTI缺少调用具有此类参数的方法的代

我的问题类似于,但我想传递一个整数数组,而不是一个集合

每个示例:

[TestCase('TestAdd','[1,2,3,4];[1,2,3,4]',';')]
procedure TestAdd(aValue, aResult: array of integer);

修改DUnitX.Utils似乎是最干净的方法,但我不确定如何进行转换。我的主要问题是,它如何知道我特别需要一个整数数组?PTypeInfo中有什么我可以利用的吗

您不能使用开放数组,因为RTTI缺少调用具有此类参数的方法的代码(实际上是由引擎盖下的两个参数实现的)。因此,您需要将签名更改为使用
TArray
或任何其他动态数组类型

然后对DUnitX.Utils的修改非常简单-只需将此函数添加到tkUString->tkDynArray的转换数组中(任何可能的优化都留给读者作为练习):


我添加了您提供的函数(并将其添加到转换矩阵中),并将测试更改为使用TArray,但数组都未初始化,导致测试中出现AVs。还有什么我遗漏的吗?请确保您的项目使用DUnitX修改(而不是西雅图附带的设备)。我在程序文件中修改了已安装的设备。我是否需要做一些特殊的事情来强制它重建或者做些什么?当然,您需要将DUnitX sources dir添加到您的项目搜索路径中,以使编译器生成这些单元。否则,它只使用位于$(BDSLib)目录中的DUnitX附带的DCU。似乎为$(DUnitX)自动设置的环境变量Delphi在我的搜索路径中,但无效,因此不起作用。我加入了完整的路径,现在它工作了。谢谢。
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;