【问题标题】:DUnitX Conversion from string to array of integerDUnitX 从字符串到整数数组的转换
【发布时间】:2016-02-22 13:37:53
【问题描述】:

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

举例:

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

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

【问题讨论】:

    标签: unit-testing delphi delphi-10-seattle dunitx


    【解决方案1】:

    您不能使用开放数组,因为 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;
    

    【讨论】:

    • 我添加了您提供的函数(并将其添加到转换矩阵中)并将我的测试更改为使用 TArray,但数组都未初始化,导致我的测试中出现 AV。我还有什么遗漏的吗?
    • 确保您的项目使用您的 DUnitX 修改(而不是西雅图随附的单元)。
    • 我在 Program Files 中修改了安装的那个。我需要做一些特别的事情来强制它重建吗?
    • 当然 - 您需要将 DUnitX 源目录添加到您的项目搜索路径中,以使编译器构建这些单元。否则,它只使用位于 $(BDSLib) 目录中的 DUnitX 的随附 dcus。
    • Delphi 自动为 $(DUNITX) 设置的环境变量似乎在我的搜索路径中,但无效,因此不起作用。我输入了完整的路径,现在它可以工作了。非常感谢。
    猜你喜欢
    • 2015-08-10
    • 2015-07-04
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多