我有一个用DUnit进行单元测试的类。它有许多方法,一些公有方法和私有方法。
type
TAuth = class(TDataModule)
private
procedure PrivateMethod;
public
procedure PublicMethod;
end;为了为这个类编写单元测试,我必须使所有的方法都是公共的。
有没有一种不同的方式来声明私有方法,这样我仍然可以测试它们,但它们不是公共的?
发布于 2009-01-07 22:16:46
你不需要公开它们。受保护的就行了。然后,您可以子类型化用于单元测试的类,并显示受保护的方法。示例:
type
TAuth = class(TDataModule)
protected
procedure MethodIWantToUnitTest;
public
procedure PublicMethod;
end;现在您可以为您的单元测试键入它的子类型:
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;但是,如果您想要进行单元测试的方法与数据模块的关系非常密切,以至于将它们设置为私有是不安全的,那么您真的应该考虑重构这些方法,以便将需要进行单元测试的代码和访问数据模块内部的代码分开。
发布于 2011-09-14 04:33:55
这有点老生常谈,但我认为这是最简单、更清晰的方法。使用以下条件编译指令:
{$IfNDef TEST}
private
{$EndIf}您的单元测试项目必须在project → conditional defines中定义测试。如果没有可见性规范,它们就会被发布。
注意:如果私有可见性不是类声明中的第一个可见性,它将获得先前的定义。一种更安全但更冗长且不太清晰的方法是:
private
{$IfDef TEST}
public
{$EndIf}与子类化或其他方法相比,这有很多优点:
我认为这是一个更清晰的解决方案,而且比选择的答案更好。
当我使用它时,我还配置了测试项目,将构建对象放在主项目的不同目录中。这可以防止带有TEST指令的二进制代码与其他代码混合。
发布于 2010-03-13 17:50:56
我推荐Gerard Meszaros的"XUnit Test Patterns“一书:
state :当我们需要访问SUT的私有状态时,我们如何使代码可测试?
Answer:添加向SUT的子类公开测试所需的状态或行为的方法。
..。如果被测系统(SUT)不是专门设计为可测试的,我们可能会发现测试无法访问它必须在测试中的某个点进行初始化或验证的状态。
本文还解释了何时使用它以及它带来的风险。
https://stackoverflow.com/questions/422379
复制相似问题