2010-03-31 37 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

相關問題