相关疑难解决方法(0)

如何测试私有函数或具有私有方法,字段或内部类的类?

如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?或者通过内部链接(static在C/C++中)或在私有(匿名)命名空间中使其成为私有的函数?

为了能够运行测试而更改方法或函数的访问修饰符似乎很糟糕.

java tdd unit-testing

2593
推荐指数
36
解决办法
82万
查看次数

如何模拟没有虚方法的类?

假设您有一个设计精良的Delphi项目,该项目尊重依赖注入和其他一些良好实践.

现在让我们假设你需要模拟一个定义为的类:

TMyClass = class
public
  procedure Method1;
  procedure Method2
end;  
Run Code Online (Sandbox Code Playgroud)

Method1而且Method2不是虚拟的.在这种情况下你做什么?要模拟一个对象,我们需要继承它和override你想要模拟的每个方法,但在这种情况下它是不可能的,因为它们不是virtual.我应该更改源代码以添加virtual我需要模拟的每个方法吗?不是很糟糕吗?

编辑

我正在考虑创建一个编译器指令来使类中的所有字段virtual成为一个好的意识形态?只有我的测试套件才会设置编译器指令.

EDIT2*

Embarcadero应该提供一种简单的方法,可以将类的方法指针更改为另一个方法点,而无需使用virtual.

delphi unit-testing mocking

7
推荐指数
3
解决办法
846
查看次数

使用RTTI访问严格的私有字段

考虑这个简单的代码

{$APPTYPE CONSOLE}

uses
  Rtti,
  SysUtils;

type
  {$M+}
  TFoo = class
  strict private
    class var Field1 : Integer;
    field2 :  Integer;
  private
    field3 :  Integer;
    class var Field4 : Integer;
  end;


Var
    ctx : TRttiContext;
    f   : TRttiField;
begin
  try
    ctx:=TRttiContext.Create;

    for f in ctx.GetType(TFoo).GetFields do
     Writeln(f.Name);


    Writeln('Done');
    readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

运行此时,仅field3列出该列表.似乎哪个RTTI不支持字段,strict private或者class var,问题是Is possible access a strict private field of a delphi class …

delphi rtti delphi-xe

6
推荐指数
1
解决办法
2171
查看次数

标签 统计

delphi ×2

unit-testing ×2

delphi-xe ×1

java ×1

mocking ×1

rtti ×1

tdd ×1