2009-07-22 68 views
2

我正在爲我們的主項目的所有單元測試構建一個專用項目,因爲將它們包括在主項目中會對已經很大的項目代碼庫。現在,主項目的所有單元都在項目的dpr文件中引用其位置。當我爲一個類編寫測試用例時,我只需從主項目的dpr中複製類單元引用(以及引用的單元單元引用)並將其粘貼到單元測試項目中。德爾福:如何在另一個項目中使用一個項目的所有單位和單位參考

這意味着最終我會得到一個dpr文件,其中包含所有主要項目dpr文件單元引用逐字,當主項目dpr更改時將很難維護。我們在這裏談論數千個單位。

我的問題是,我可以以某種方式將一個項目的所有單位引用包含在另一個項目中?只需要將主項目編譯到一個目錄中,並將其包含在單元測試項目中,dcu搜索路徑是不夠的,因爲單元具有必須執行的初始化例程。

回答

2

我想要實現這一點的方法是創建一個程序來獲取現有的DPR文件並生成一個包含文件,然後在我的測試應用程序中使用它。你可以使用tStringlist來完成大部分的工作。該項目將在運行PRIOR之前構建您的測試用例。

var 
    OrigDpr : tStringlist; 
begin 
    OrigDpr := tSTringlist.create; 
    OrigDpr.LoadFromFile(originalprojectname); 
    while (OrigDpr.Count > 0) and (not SameText('uses',OrigDpr.Strings[0])) do 
    OrigDpr.Delete(0); 
    // delete the uses line. 
    if (OrigDpr.Count > 0) then 
    OrigDpr.Delete(0); 
    while (OrigDpr.Count > 0) and 
     (not SameText('{$R *.RES}',OrigDpr.Strings[OrigDpr.Count-1]) do 
    OrigDpr.Delete(OrigDpr.Count-1); 
    // delete the $R reference 
    if (OrigDpr.Count > 0) then 
    OrigDpr.Delete(OrigDpr.Count-1); 

    OrigDpr.SaveToFile('pathtotestproject\TESTPROJECT.INC'); 
end; 

然後在您的測試DPR中,在您的項目使用條款中添加以下代碼。由於使用條款包括文件已經包含了分號,使用包含文件在您的正常測試單元結束:

USES 
    // test units go FIRST 
    {$I pathtotestproject\TESTPROJECT.INC} 

我的假設是,你正在執行遲到/鬆散綁定,這就是爲什麼所有的這首先是必要的(除了進入DPR之外,這些單位沒有被引用)。否則,只要使用任何一個單元就足以讓初始化代碼執行。

編輯

另一種選擇是有第一個程序生成一個完整的單元,然後在您的測試應用程序使用本機。這將在所有引用單元的初始化/終止代碼中進行編譯。然後,您的測試應用程序將不得不使用您提到的全局存儲庫來訪問這些對象。

這裏的一個重要部分是確保測試項目搜索路徑包含其他項目的源目錄。

2

不,沒有辦法做到這一點(好),但它可能並不重要。 IDE維護着DPR,並且對事物的引用有着令人難以置信的挑剔。在其他單位中工作正常的技術(如包含文件)在DPR中無法可靠工作。當然,他們會編譯,直到你做了一些事情導致IDE修改DPR,此時DPR代碼可能會被損壞。

但是,在DPR中包含每個引用文件並不是必須的。這是一個好主意,因爲它似乎使IDE更快樂,但是如果DPR只引用了你的測試並且測試引用了主項目中的單元,那麼所有東西都可以工作。

+0

另一方面,如果一個單位在.dpr中,例如一個錯誤的路徑,可以得到可怕的奇怪錯誤。 – 2009-07-22 21:14:28

+0

當測試引用主項目的單元時,他們需要引用它們的路徑,據我所知只有在dpr中才有可能。 – Ozan 2009-07-23 11:01:54

0

我總是保持參考文獻的數量。DPR最小:

  • 的單位,具有重要的初始化
  • 單位中涉及的VFI繼承
  • 單位是自動實例化的形式。
  • 有時候會有幾個中央單元用ctrl-enter快速導航業務代碼。

並始終以最小(相對)路徑儘可能。

工作正常,只有一個小問題,通過file-> open瀏覽單元有時會混淆當前工作目錄,從而導致相關路徑的「根」。解決方法是在basedirs中執行文件 - >打開單元。