当我有一个新单位时,为什么'使用单位'会消失?

时间:2010-03-31 17:57:57

标签: delphi dunit

我使用DUnit框架为我的应用程序提供了一个单元测试项目。 这个项目有一个由$IFDEF包围的单元,用于在xml文件中输出测试结果,而不是gui或just命令行。通过切换Build配置来​​启用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(一个带有'File> New> Unit'的新单元)向IDE添加新单元时,问题开始

现在测试项目:

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

如您所见,测试XML_OUTPUT已消失...每次添加单元时,Delphi IDE都会删除此测试。

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

5 个答案:

答案 0 :(得分:7)

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

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...

unit XMLTestRunnerProxy;

interface

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

implementation

end.

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

无论如何,只有实际使用的代码被编译到您的应用程序中,所以通常情况下,Uses子句中的单元没有被使用也没什么坏处。

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

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

答案 3 :(得分:5)

只要IDE必须修改DPR的USES子句,就会发生剥离。使用“另存为”重命名单位将执行相同的操作。

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

是的,这是一个错误。 QC#6294具体而言,它是公开的,所以Embarcadero意识到了这个问题。

答案 4 :(得分:0)

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