首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DUnit测试私有方法?

如何使用DUnit测试私有方法?
EN

Stack Overflow用户
提问于 2009-01-07 22:10:50
回答 7查看 4.3K关注 0票数 17

我有一个用DUnit进行单元测试的类。它有许多方法,一些公有方法和私有方法。

代码语言:javascript
复制
type
  TAuth = class(TDataModule)
  private
    procedure PrivateMethod;
  public
    procedure PublicMethod;
  end;

为了为这个类编写单元测试,我必须使所有的方法都是公共的。

有没有一种不同的方式来声明私有方法,这样我仍然可以测试它们,但它们不是公共的?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-01-07 22:16:46

你不需要公开它们。受保护的就行了。然后,您可以子类型化用于单元测试的类,并显示受保护的方法。示例:

代码语言:javascript
复制
type
  TAuth = class(TDataModule)
  protected
    procedure MethodIWantToUnitTest;
  public
    procedure PublicMethod;
  end;

现在您可以为您的单元测试键入它的子类型:

代码语言:javascript
复制
interface

uses
  TestFramework, Classes, AuthDM;

type
  // Test methods for class TAuthDM
  TestAuthDM = class(TTestCase)
     // stuff
  end;

  TAuthDMTester = class(TAuthDM)
  public
    procedure MethodIWantToUnitTestMadePublic;
  end;

implementation

procedure TAuthDMTester.MethodIWantToUnitTestMadePublic;
begin
  MethodIWantToUnitTest;
end;

但是,如果您想要进行单元测试的方法与数据模块的关系非常密切,以至于将它们设置为私有是不安全的,那么您真的应该考虑重构这些方法,以便将需要进行单元测试的代码和访问数据模块内部的代码分开。

票数 21
EN

Stack Overflow用户

发布于 2011-09-14 04:33:55

这有点老生常谈,但我认为这是最简单、更清晰的方法。使用以下条件编译指令:

代码语言:javascript
复制
  {$IfNDef TEST}
  private
  {$EndIf}

您的单元测试项目必须在project → conditional defines中定义测试。如果没有可见性规范,它们就会被发布。

注意:如果私有可见性不是类声明中的第一个可见性,它将获得先前的定义。一种更安全但更冗长且不太清晰的方法是:

代码语言:javascript
复制
  private
  {$IfDef TEST}
  public
  {$EndIf}

与子类化或其他方法相比,这有很多优点:

  • 没有额外的复杂性:在你的代码中没有额外的类。
  • 没有人可以“错误地”子类化和重写你的类:你保留了你的类你说一个方法是受保护的,你多少希望它会被重写。您是在为正在阅读您的代码的人讲述这一点。一个不应该被重写的受保护的方法会让你的代码读者感到困惑,破坏了我的第一个编程原则:“代码必须被写成能被其他人读到,beings."
  • DUnit是在他们自己的单元里,不包括everywhere.
  • You,不要接触凌乱的RTTI.

我认为这是一个更清晰的解决方案,而且比选择的答案更好。

当我使用它时,我还配置了测试项目,将构建对象放在主项目的不同目录中。这可以防止带有TEST指令的二进制代码与其他代码混合。

票数 9
EN

Stack Overflow用户

发布于 2010-03-13 17:50:56

我推荐Gerard Meszaros的"XUnit Test Patterns“一书:

state :当我们需要访问SUT的私有状态时,我们如何使代码可测试?

Answer:添加向SUT的子类公开测试所需的状态或行为的方法。

..。如果被测系统(SUT)不是专门设计为可测试的,我们可能会发现测试无法访问它必须在测试中的某个点进行初始化或验证的状态。

本文还解释了何时使用它以及它带来的风险。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/422379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档