2010-03-31 35 views
4

我有一个使用DUnit框架的应用程序的单元测试项目。 这个项目的一个单元被一个$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已经消失了......每次我加入一个单元,德尔福IDE删除此测试。

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

回答

5

只有实际使用的代码才会被编译到您的应用程序中,所以通常情况下,Uses子句中的单元不会被使用。

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

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

+0

因为'XmlTestRunner2'没有任何初始化代码而不是单元测试文件,所以我可以肯定地将这个监听器添加到使用列表中。只有稍后调用才会链接,具体取决于构建配置。 ** So Marcus,所以解决了我的问题!** 在其他情况下,我会应用'gabr'中的'proxy unit'方法。 – TridenT 2010-04-01 09:11:34

5

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

我要做的就是将XmlTestRunner2单元留在项目中,并将IFDEF放入单元本身,以便如果您没有设置XML_OUTPUT,则不会编译任何内容。

+0

我不想通过添加IFDEFs来改变单位。将其视为第三方单元。你的想法很好,但我不喜欢它:) – TridenT 2010-04-01 06:41:17

7

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

program DelphiCodeToDoc_Tests; 

uses 
    ... 
    XMLTestRunnerProxy, 
    ... 

unit XMLTestRunnerProxy; 

interface 

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

implementation 

end. 
+0

这是我应该使用的一个好主意。 但在这种情况下,我会接受'Marcus Adams'的答案 – TridenT 2010-04-01 09:06:09

+0

+1有人说:“错误或缺陷是导致不愉快意外的任何行为。”从你的dpr中抽出有意识的手动代码是最令人惊讶的,而不是一点点不愉快! – 2011-04-01 12:57:00

5

的剥离发生任何时候IDE有权修改DPR的uses子句。使用“另存为”重命名一个单位将做同样的事情。

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

是的,这是一个错误。 QC#6294具体而言,它是开放的,所以英巴卡迪诺知道这个问题。

+0

他们意识到了这个问题,但是从我在Embarcadero论坛上看到的问题来看,它似乎是其中的一个“这是通过设计,可能不会得到修复,很抱歉”的问题。 – 2010-03-31 21:10:17

+0

我告诉Mike Rozlog,我认为它对重构支持反映不佳,并且它使跨平台工作更加困难,他的回应比这更积极。我假设他们听到的事情越多,他们解决问题的可能性就越大。 – 2010-03-31 21:21:37

+0

感谢您的回复和QC链接。我应该看到它! – TridenT 2010-04-01 09:04:59

0

考虑有两个项目。一旦使用可选代码,一个没有。然后建立你想要的,或两者。使用项目组,他们将很好地工作。

+0

是的,但我需要同步两个项目文件。即使我不经常修改它,也会遇到不同步的情况! – TridenT 2010-04-01 09:37:27

相关问题