【问题标题】:Checking private fields in unit testing检查单元测试中的私有字段
【发布时间】:2014-02-02 20:33:31
【问题描述】:

我有以下接口和类

interface
....
  MyInterface = interface
    ['{079729DE-3E8C-4C1B-80AD-114F0A4CD04A}']
    function MyFunction : integer;
    procedure MyProcedure;
  end;

  TMyClass = class (TInterfacedObject, MyInterface)
  private
    FMyValue : integer;
  public
    function MyFunction : integer;
    procedure MyProcedure;
  end;

implementation
.....
function TMyClass.MyFunction: integer;
var
  aResult : integer;
begin
  { here the value of AResult is changed}
  result := aResult;
end;

procedure TMyClass.MyProcedure;
var
  aValue : integer;
begin
  { here the value of FMyValue is changed}
  { here the value of aValue is changed}
end;

我可以通过 check (MyFunction=...) 轻松检查MyFunction 的结果,但我不知道如何在程序结束时检查FMyValyeaValue 的值。

我宁愿避免在接口和类中添加一个额外的函数,该函数检索FMyValueaValue 的值,因为仅用于测试而不用于生产。

【问题讨论】:

  • 不需要检查私有字段。如果公共方法执行它们应该执行的操作并且类本身的行为符合预期,则该值无关紧要。

标签: delphi unit-testing


【解决方案1】:

您不想检查私有成员和局部变量的值。它们不是外部可见界面的一部分,因此它们的值无关紧要。

如果您担心这些值,那么您的代码架构设计不正确。合适的解决方案当然是重新设计代码。

当然,您可以将私有字段设为公开,或者通过 out 参数返回局部变量。但你不想那样做,是吗?

【讨论】:

  • David, @Sir Rufo 是的,最重要的是类的行为和它的结果,但有时程序会完成多项任务并且从不将结果作为函数返回。我的想法是测试局部变量以测试过程中包含的每个任务。
  • 为了设计的正确,您是否建议将程序转换为函数并测试相同函数返回的结果?
  • 没有。我建议您不要尝试测试私人不可观察的事物。测试公共接口。
【解决方案2】:

为了能够在不添加 getter 的情况下测试 FMyValue,您可以将其设为受保护而不是私有。

在您的测试中,您可以添加一个可以访问该值的派生类,以便您检查它。

【讨论】:

  • 如果我没记错的话,我应该通过 TMyClass 而不是通过 MyInterface 访问 FMyValue。如果是这样,我将失去依赖注入的好处。我该如何解决这个问题?
  • 在您的生产代码中,您继续使用您的界面。在你的测试中,当你想测试你的实现时,你可以直接操作TMyClass(或其派生类),因为无论如何它都是你想要测试的
猜你喜欢
  • 2016-10-25
  • 2010-11-08
  • 1970-01-01
  • 2020-11-15
  • 2022-01-15
  • 2011-08-20
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多