4

我有一个使用 DUnit 框架的应用程序的单元测试项目。这个项目有一个被 a 包围的单元,$IFDEF用于在 xml 文件中输出测试结果,而不是 gui 或只是命令行。XML_OUTPUT 定义通过切换构建配置启用。

program DelphiCodeToDoc_Tests;

uses
  TestFramework,
  TextTestRunner,
  Sysutils,
  Forms,
  GUITestRunner,
{$IFDEF XML_OUTPUT}
  XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
{$ENDIF}
  DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
  ...

这完美地工作。当我从 IDE 向该项目添加一个新单元时,问题就开始了(一个带有“文件>新建>单元”的新单元)。

测试项目现在是:

uses
  TestFramework,
  TextTestRunner,
  Sysutils,
  Forms,
  GUITestRunner,
  DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
  ...
  MyNewUnit in 'IntegrationTests\MyNewUnit.pas';

如您所见,测试 XML_OUTPUT 消失了……每次我添加一个单元时,Delphi IDE 都会删除该测试。

你知道为什么以及如何避免它吗?

4

5 回答 5

7

您可以在主程序中添加一个代理单元来绕过这个有问题的行为(我们中的许多人认为这是一个错误,而不是一个特性)。

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...

unit XMLTestRunnerProxy;

interface

{$IFDEF XML_OUTPUT}
uses
  XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
{$ENDIF}

implementation

end.
于 2010-03-31T18:46:50.970 回答
5

DPR 的使用列表由 IDE 管理。不幸的是,您对此无能为力。正式地,您不应该将 IFDEF 放在 DPR 的使用列表的中间,因为如果您这样做,它会做这样的事情。

我要做的是将 XmlTestRunner2 单元留在项目中,并将 IFDEF 放在单元本身中,这样如果您没有设置 XML_OUTPUT,它就不会编译任何东西。

于 2010-03-31T18:06:07.530 回答
5

无论如何,只有实际使用的代码才会编译到您的应用程序中,因此通常情况下,在Uses子句中包含未使用的单元并没有什么坏处。

当您在 IDE 中运行程序时,您可以看到链接到您的应用程序的所有代码。您应该在所有已编译代码旁边看到蓝点。

需要注意的是,您应该检查所initialization关注的单元部分。初始化部分中的任何代码只要包含该单元就会自动包含在内,因为该部分中的任何代码都会在应用程序启动后立即运行。如果需要,您可以在单元的初始化部分中添加编译器指令,以避免任何初始化代码被链接并运行。

于 2010-03-31T18:21:31.867 回答
5

每当 IDE 必须修改 DPR 的USES 子句时,就会发生剥离。使用“另存为”重命名一个单位将做同样的事情。

为了解决这个问题,我总是在外部将我的新单元创建为一个空文本文件,然后手动将它们添加到 DPR。最初需要做更多的工作,但最终只在必要时才包含这些单元。另请注意,如果您使用的是 Delphi 2005 之后的版本,您可以切换到编辑窗格底部的“历史”选项卡并复制“本地文件”内容以获取该单元之前的版本被添加,其他一切都被剥离。

是的,这是一个错误。 特别是QC#6294,它是开放的,所以 Embarcadero 意识到了这个问题。

于 2010-03-31T18:56:09.500 回答
0

考虑有两个项目。一次带有可选代码,一次没有。然后构建任何你想要的,或两者兼而有之。使用项目组,他们会很好地工作。

于 2010-04-01T09:04:31.230 回答